Hibernate基础

**

一、什么是Hibernate?

**
  Hibernate是一个轻量级的ORMapping框架
  ORMapping原理(Object Relational Mapping)

在这里插入图片描述

ORMapping基本对应规则

  • 1:类跟表相对应
  • 2:类的属性跟表的字段相对应
  • 3:类的实例与表中具体的一条记录相对应
  • 4:一个类可以对应多个表,一个表也可以对应对个类
  • 5:DB中的表可以没有主键,但是Object中必须设置主键字段
  • 6:DB中表与表之间的关系(如:外键)映射成为Object之间的关系
  • 7:Object中属性的个数和名称可以和表中定义的字段个数和名称不一样

ORMapping的基本实现方式
使用JDBC,用SQL来操作数据库,只是看动态生成还是人工写代码来实现。
大家想想,我们实现过ORMapping吗?

在这里插入图片描述

**

二、Hibernate能干什么:

**

Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。

Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。

Hibernate可以帮助你消除或者包装那些针对特定厂商的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。

在这里插入图片描述

一个非常简要的Hibernate体系结构的高层概要图

在这里插入图片描述

Hibernate运行时体系结构
“最小”的体系结构方案,要求应用程序提供自己的 JDBC 连接并管理自己的事务。这种方案使用了Hibernate API 的最小子集.

在这里插入图片描述

“全面解决”的体系结构方案,将应用层从底层的JDBC/JTA API中抽象出来,而让Hibernate来处理这些细节。

在这里插入图片描述

**

三、Hibernate中的对象

**
SessionFactory (org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成的工厂,本身要用到。
Session (org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了连接,也是的工厂。
Transaction (org.hibernate.Transaction)
应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的、以及事务隔离开。
ConnectionProvider (org.hibernate.connection.ConnectionProvider)
生成连接的工厂(有连接池的作用)。它通过抽象将应用从底层的或隔离开。仅供开发者扩展/实现用,并不暴露给应用程序使用。
TransactionFactory (org.hibernate.TransactionFactory)
生成对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。

示例如下:
数据库表:Student.sql

CREATE TABLE "STUDENT" 
(    "STUNO" VARCHAR2(20), "STUNAME" VARCHAR2(20), "STUPASS" VARCHAR2(20), "STUSEX" VARCHAR2(2), "MOBILE" VARCHAR2(20), "EMAIL" VARCHAR2(20), "ADDRESS" VARCHAR2(50), "STUAGE" NUMBER
)

配置文件:hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><!-- 数据库URL --><property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property><!-- 数据库用户名 --><property name="connection.username">zhengcheng</property><!-- 数据库密码 --><property name="connection.password">123123</property><!-- JDBC驱动 --><property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property><!-- 每个数据库都有对应的Dialect以匹配其平台特性 --><property name="dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 指定当前session范围和上下文 --><property name="current_session_context_class">thread</property><!-- 指定运行期生成的SQL输出到日志以供调试 --><property name="show_sql">true</property><!-- 是否格式化sql --><property name="format_sql">true</property><!-- 映射文件 --><mapping resource="Student.hbm.xml" />    </session-factory>
</hibernate-configuration>

1:与被描述的类同名 ,如:Student.hbm.xml
2:存放位置与所描述类存放在同一文件夹下
3:主要有如下四部分配置 :
(1)类和表的映射
(2)主键的映射
(3)类的属性和DB中字段的映射
(4)关系的映射
4:配置的时候可以到hibernate发行包里面找个例子,比如可以用“\project\hibernate-core\src\test\java\org\hibernate\test\cid”下面的Customer.hbm.xml作例子
映射文件:Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="hibDemo1.entity.Student" table="STUDENT"><id name="stuNo" type="java.lang.String" column="STUNO"><!--generator的class类型assigned:主键的状态 assigned表示程序生成sequence:Oracle中的序列identity:Sql中的自动编号increment:先查询最大的编号再增1uuid:生成32位长的字符串native:根据数据库自动生成--><generator class="assigned" /></id><!-- 直接使用property属性设置 --><property name="stuName" type="java.lang.String" column="STUNAME" length="50" not-null="true" /><!-- 使用column设置 --><property name="stuPass" type="java.lang.String" column="STUPASS"><column name="STUPASS" length="50" not-null="true"></column></property><property name="stuSex" type="java.lang.String" column="STUSEX" /><property name="stuAge" type="java.lang.Integer" column="STUAGE" /><property name="Mobile" type="java.lang.String" column="MOBILE" /><property name="Email" type="java.lang.String" column="EMAIL" /><property name="Address" type="java.lang.String" column="ADDRESS" /></class>
</hibernate-mapping>

客户端文件:

java代码:StudentService.java

package hibDemo1.dao;import hibDemo1.entity.Student;import java.util.List;import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;public class StudentService {private static Configuration conf;private static SessionFactory sf;private static Transaction tx;static {try {conf = new Configuration().configure();sf = conf.buildSessionFactory();} catch (HibernateException e) {e.printStackTrace();}}public static Session getSession() {return sf.openSession();         //过去老的方法,不需要使用事务//return sf.getCurrentSession(); // 新的方法,需要和事务一起使用,可以保证每个用户创建的session独立,需要在配置文件中配置//<property name="current_session_context_class">thread</property>}/*** 获取所有学生列表* * @return*/public List<Student> GetAllStudent() {List<Student> list = null;Session session = getSession();if (session != null) {try {String hql = "from Student";Query query = session.createQuery(hql);list = query.list();} catch (HibernateException e) {e.printStackTrace();} finally {session.close();}}return list;}/*** 获取单个学生信息* * @param stuNo* @return*/public Student GetStudentBystuNo(String stuNo) {Student stu = null;Session session = getSession();if (session != null) {try {// get如果没有查询到数据,则返回null// stu = (Student) session.get(Student.class, stuNo);// load如果没有查询到数据,则抛出异常stu = (Student) session.load(Student.class, stuNo);} catch (HibernateException e) {e.printStackTrace();} finally {session.close();}}return stu;}/*** 添加一个学生* * @param stu* @author Administrator*/public boolean AddStudent(Student stu) {boolean b = false;Session session = getSession();if (session != null) {try {// 开启一个事务tx = session.beginTransaction();// 保存session.save(stu);// 提交事务tx.commit();return true;} catch (HibernateException e) {e.printStackTrace();tx.rollback();} finally {session.close();}}return b;}/*** 更新一个学生* * @param stu* @author Administrator*/public boolean UpdateStudent(String stuNo, String newName) {boolean b = false;Session session = getSession();if (session != null) {try {// 开启一个事务tx = session.beginTransaction();// 获取一个学生对象Student stu = (Student) session.load(Student.class, stuNo);// 更新某个属性stu.setStuName(newName);// 提交事务tx.commit();return true;} catch (HibernateException e) {e.printStackTrace();tx.rollback();} finally {session.close();}}return b;}/*** 更新一个学生* * @param stu* @author Administrator*/public boolean DeleteStudent(String stuNo) {boolean b = false;Session session = getSession();if (session != null) {try {// 开启一个事务tx = session.beginTransaction();// 获取一个学生对象Student stu = (Student) session.load(Student.class, stuNo);// 删除操作session.delete(stu);// 提交事务tx.commit();return true;} catch (HibernateException e) {e.printStackTrace();tx.rollback();} finally {session.close();}}return b;}
}

test.java

package hibDemo.test;import hibDemo1.dao.StudentService;
import hibDemo1.entity.Student;import java.util.List;
import java.util.Scanner;public class test {public static void main(String[] args) {// 添加学生信息// AddStudent();// 显示所有学生信息ShowAll();// 显示单个学生信息// ShowOne();//更新学生信息//Update();//删除学生信息//Delete();ShowAll();}public static void ShowAll() {StudentService service = new StudentService();List<Student> list = service.GetAllStudent();for (Student student : list) {System.out.println(student.getStuNo() + "  " + student.getStuName());}}public static void ShowOne() {String no = "A004";StudentService service = new StudentService();Student student = service.GetStudentBystuNo(no);if (student != null) {System.out.println(student.getStuNo() + "  " + student.getStuName());} else {System.out.println("no data");}}public static void AddStudent() {Scanner input = new Scanner(System.in);Student stu = new Student();System.out.print("请输入学生编号:(A001)");stu.setStuNo(input.next());System.out.print("请输入学生姓名:(A001)");stu.setStuName(input.next());stu.setStuPass("888888");System.out.print("请输入学生年龄:(0-100)");stu.setStuAge(input.nextInt());System.out.print("请输入学生手机号:(A001)");stu.setMobile(input.next());System.out.print("请输入学生邮箱:(A001)");stu.setEmail(input.next());System.out.print("请输入学生地址:(A001)");stu.setAddress(input.next());StudentService service = new StudentService();service.AddStudent(stu);}public static void Update() {Scanner input = new Scanner(System.in);System.out.print("输入要修改的学号:");String stuNo = input.next();System.out.print("输入要修改的姓名:");String newName = input.next();StudentService service = new StudentService();service.UpdateStudent(stuNo, newName);}public static void Delete() {Scanner input = new Scanner(System.in);System.out.print("输入要修改的学号:");String stuNo = input.next();StudentService service = new StudentService();service.DeleteStudent(stuNo);}
}

说明:
1:SessionFactory sf = new Configuration().configure().buildSessionFactory();这句话的意思是读取hibernate.cfg.xml,创建Session工厂,是线程安全的。
默认是”hibernate.cfg.xml”,不用写出来,如果文件名不是”hibernate.cfg.xml”,那么需要显示指定,如下:
SessionFactory sf = new Configuration(). configure( “javass.cfg.xml” ).buildSessionFactory();
2:Session是应用程序主要使用的Hibernate接口,约相当于JDBC的Connection+Statement/PreparedStatement的功能,是线程不安全的

3:在Hibernate4里面,已经不推荐使用Configuration类了,而改为使用 ServiceRegistryBuilder和MetadataSources来代替,新的写法大致如下:
ServiceRegistryBuilder builder = new ServiceRegistryBuilder().configure();
builder.applySetting(“connection.driver_class”, “oracle.jdbc.driver.OracleDriver”);
builder.applySetting(“connection.url”, “jdbc:oracle:thin:@localhost:1521:orcl”);
builder.applySetting(“connection.username”, “ztb”);
builder.applySetting(“connection.password”, “ztb”);
builder.applySetting(“connection.pool_size”, “2”);
builder.applySetting(“hibernate.dialect”, “org.hibernate.dialect.OracleDialect”);
builder.applySetting(“show_sql”, “true”);

MetadataSources sources = new MetadataSources( builder.buildServiceRegistry() );
sources.addResource(“cn/javass/h4/hello/UserModel.hbm.xml”);

MetadataImpl metadata = (MetadataImpl) sources.buildMetadata();
SessionFactory sf = metadata.getSessionFactoryBuilder().buildSessionFactory();
这种写法,现在还没有实现完全,不太好用,所以官方给出的示例里面还是采用以前的方式,大家先了解一下。
4:这里使用的事务Transaction是Hibernate的Transaction,需要有,不能去掉。

为什么必须有这个Hibernate的事务呢?以HelloWorld为例来看看:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进击的.NET 在云原生时代的蜕变

你一定看过这篇文章 《进击的 Java &#xff0c;云原生时代的蜕变》, 本篇文章的灵感来自于这篇文章。北京时间9.24 就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Core。.NET 生态系统是一个不断变化的生态圈&#xff0c;我相信它正在朝着一个伟大的方向发…

Hibernate懒加载问题的5种解决方案

** 1、Hibernate基础 ** Hibernate基础&#xff0c;传送门 ** 2、什么是Hibernate懒加载 ** 当我们查询一个对象的时候&#xff0c;在默认情况下&#xff0c;返回的只是该对象的代理对象&#xff0c;当用户去使用该对象的属性时&#xff0c;才会向数据库再一次发出查询语…

程序员过关斩将--要想获取我的用户信息,就得按照规矩来

菜菜君&#xff0c;我又来啦又有什么事吗&#xff1f;我按照你上篇文章写的JWT的方式已经把网站认证写完了&#xff0c;而且效果还不错那恭喜你呀&#xff0c;下次面试又多了一项技能不过&#xff0c;现在又有一个问题&#xff0c;我做的系统有一个合作商想要利用我们的用户信息…

E. Surprise me!(莫比乌斯反演 + 虚树 DP)

E. Surprise me! ∑i1n∑j1nϕ(aiaj)d(i,j)设paii∑i1n∑j1nϕ(ij)d(pi,pj)∑i1n∑j1nϕ(i)ϕ(j)ϕ(gcd⁡(i,j))gcd⁡(i,j)d(pi,pj)∑d1ndϕ(d)∑i1nd∑j1ndϕ(id)ϕ(jd)d(pid,pjd)[gcd⁡(i,j)1]∑d1ndϕ(d)∑k1ndμ(k)∑i1nkd∑j1nkdϕ(ikd)ϕ(jkd)d(pikd,pjkd)Tkd∑T1n(∑i1n…

Hibernate 的缓存机制

** 1、Hibernate 应用程序中按照缓存的范围&#xff0c;可以将缓存分为三类 ** &#xff08;1.1&#xff09;事务范围缓存&#xff08;单Session&#xff0c;即一级缓存&#xff09; 事务范围的缓存只能被当前事务访问&#xff0c;每个事务都有各自的缓存。缓存的生命周期依…

.NET分布式大规模计算利器-Orleans(一)

写在前面Orleans是基于Actor模型思想的.NET领域的框架&#xff0c;它提供了一种直接而简单的方法来构建分布式大规模计算应用程序&#xff0c;而无需学习和应用复杂的并发或其他扩展模式。我在2015年下半年开始应用Orleans&#xff0c;当时公司的交易系统采用的架构就是基于Orl…

从单机应用到微服务,用户认证走几步?

用户认证指在用户访问服务的时候确认用户的身份&#xff0c;受限于HTTP无状态的特性&#xff0c;应用开发者需要自行实现用户认证相关功能。通常是用户登录时服务端生成通行证返回给客户端&#xff0c;客户端在接下来的请求中携带通行证&#xff0c;然后服务端通过校验该通行证…

编写优雅代码,从挖掉恶心的if/else 开始

背景长话短说&#xff0c; 作为开发人员经常需要根据条件灵活查询数据库&#xff0c;不管你是用rawsql 还是EFCore&#xff0c; 以下类似伪代码大家都可能遇到&#xff1a;特别是在大数据产品或者物联网产品中&#xff0c;字段甚多&#xff1b;if/else 写到死&#xff0c;一边写…

.NET Conf 2019 大会上发布.NET Core 3.0

北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演&#xff0c;主要围绕.NET Core 3.0的新特性和社区展开。多功能性是.Net Core 成为我们的生活一部分的最好解释。如果您是Web开发人员还是想开发桌面或移动应用程序&#xff0c;如果您是游戏…

Spring AOP实现原理

先说结论&#xff1a; Spring AOP采用的是JDK动态代理 CGLIB动态代理模式。当当前类为接口的实现时&#xff0c;采用JDK动态代理&#xff0c;否则用CGLIB、 1、AOP 的存在价值 在传统 OOP 编程里以对象为核心&#xff0c;整个软件系统由系列相互依赖的对象所组成&#xff0c…

微软推出Python免费在线教程视频

开源中国曾报道过最近微软针对 Python 初学者&#xff0c;推出了一套免费的教程视频。这套视频名为 Python for Beginners&#xff0c;该在线教学视频由微软高级项目经理 Christopher Harrison、以及微软 AI Gaming 的商业开发经理 Susan Ibach 共同讲解&#xff0c;在课程中加…

推荐neter常用优秀开源项目系列之一

.net社区有很多优秀的开源项目&#xff0c;我们今天先推荐6个开源项目&#xff1b;1.MassTransitMassTransit 是一个自由、开源、轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序。MassTransit在现有消息传输上提供了一组广泛的功能, 从而使开发人员能够友好地使用基于…

聊聊高并发下库存加减那些事儿——“异步扣减库存”

聊聊高并发下库存加减那些事儿不定期福利发放哦聊聊高并发下库存加减那些事儿背景一般在日常开发中经常会遇到打折促销&#xff0c;秒杀活动&#xff0c;就如拼多多最近的4999抢券买爱疯11促销活动&#xff0c;毕竟谁的钱也不是大风刮来的&#xff0c;有秒杀有促销必定带来大量…

什么是MVC

什么是MVC&#xff1f; MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范。 用一种业务逻辑、数据、界面显示分离的方法&#xff0c;将业务逻辑聚集到一个部件里面&#xf…

SpringMVC 、Struts的区别

先说结论&#xff1a;目前Spring MVC已经一统江山&#xff0c;Struts正在被抛弃 1、Spring MVC原理 Spring 体系&#xff1a; Spring MVC工作流程图 SpringMVC的工作流程描述 1. 用户向服务器发送请求&#xff0c;请求被Spring前端控制Servelt DispatcherServlet捕获&#x…

基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理

说明&#xff1a;.NET Core版本为:2.2 AdminLTE版本为:2.4.18 Bootstrap版本为:3.4.1 font-awesome版本为:4.7.01、新建项目&#xff1a;AdminLteDemo&#xff0c;添加区域Admin 在Areas/Admin/Views文件夹添加文件并分别添加如下代码&#xff1a;_ViewImports.cshtmladdTagHel…

Spring boot——起步依赖

一、起步依赖 1、是什么 本质上是一个Maven项目对象模型&#xff08;Project Object Model&#xff0c; POM&#xff09;&#xff0c; 定义了对其他库的传递依赖&#xff0c;这些东西加在一起即支持某项功能。 比如&#xff1a; spring-boot-dependencies^ spring-boot-pare…

[翻译] ASP.NET Core 3.0 的新增功能

全文翻译自微软官方文档英文版 Whats new in ASP.NET Core 3.0本文重点介绍了 ASP.NET Core 3.0 中最重要的更改&#xff0c;并提供相关文档的连接。BlazorBlazor 是 ASP.NET Core 中的一个新的框架&#xff0c;用于使用 .NET 构建交互式的客户端 Web UI&#xff1a;使用 C# 而…

Sprig boot自动配置

1、概述 Spring Boot是Spring旗下众多的子项目之一&#xff0c;其理念是约定优于配置&#xff0c;它通过实现了自动配置&#xff08;大多数用户平时习惯设置的配置作为默认配置&#xff09;的功能来为用户快速构建出标准化的应用。Spring Boot的特点可以概述为如下几点&#x…

.NET Core 3.0稳定版发布

一年一度的 .NET 开发者盛会 .NET Conf 2019 已正式开始了&#xff08;举办时间为 9.23-9.25&#xff09;。大会第一天最重磅也是最激动人心的消息莫过于 .NET Core 3.0 稳定版的发布。.NET 项目管理总监 Scott Hunter 在大会宣布了这则消息&#xff0c;并在主题演讲环节围绕 .…