Hibernate简介:
Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
---- 百度百科《Hibernate》
实现持久化的方法:
(1)对象的序列化
即实现了Serializable接口的类。适合于少量的对象进行暂时的持久化,适合于在网络上传输对象。但不符合企业级应用的需要。因为企业应用中对数据的要求是大量的、长时间保存的、需要进行大规模查询。
(2)JDBC
优点:功能完备、从理论上说效率是最高的;可以存储海量的数据并且适合进行大规模检索
缺点:开发效率和维护效率低;开发难度大,代码量大,占到到总代码量的1/3,或1/2
(3)ORM
ORM,即Object-Relational Mapping,对象关系映射。它是一种解决问题的思路,是一种思想。它的实质就是将关系数据库中的业务数据用对象的形式表示出来,并通过面向对象的方式将这些对象组织起来,以实现系统业务逻辑。或者说,ORM就是内存中的对象与数据库中的数据间的映射关系。
ORM的特点:开源的,实现了JDBC的封装, 实现了简单的API,轻量级解决方案,持久化对象是一个POJO类。最有名的ORM框架就是Hibernate。
JPA框架:
JPA,Java Persistence API,是Java EE 5的标准ORM接口。它是一种规范,一套接口,但不是实现。用于实现这一规范的ORM很多,其中Hibernate就是之一。
JPA、ORM、Hibernare之间的关系:
ORM是一种思想。JPA则是这种思想的具体的表现形式,是以Java语法规范表现出来的一种形式,是一套标准接口。Hibernate则是这套接口的具体实现。
Hibernate5基本jar包:略
Hibernate第一个程序:
1. Hibernate工作原理:
其中hibernate.cfg.xml文件名不能更改,*.hbm.xml中的*,最好用对应的类名替代。
2. 搭建Hibernate程序过程:
(1) 定义持久化对象:
1 package com.tongji.beans; 2 3 public class Student { 4 private Integer id; //定义实体的id要用Integer不能用int,因为底层要判断id == null 5 private String name; 6 private int age; 7 private double score; 8 9 public Student() { 10 super(); 11 } 12 13 public Student(String name, int age, double score) { 14 super(); 15 this.name = name; 16 this.age = age; 17 this.score = score; 18 } 19 20 public Integer getId() { 21 return id; 22 } 23 24 public void setId(Integer id) { 25 this.id = id; 26 } 27 28 public String getName() { 29 return name; 30 } 31 32 public void setName(String name) { 33 this.name = name; 34 } 35 36 public int getAge() { 37 return age; 38 } 39 40 public void setAge(int age) { 41 this.age = age; 42 } 43 44 public double getScore() { 45 return score; 46 } 47 48 public void setScore(double score) { 49 this.score = score; 50 } 51 52 @Override 53 public String toString() { 54 return "Student [id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + "]"; 55 } 56 57 }
(2)配置映射文件(*.hbm.xml):
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping> 7 <!-- 类到表的映射,属性到字段的映射 --> 8 <class name="com.tongji.beans.Student" table="t_student"> 9 <id name="id" column="tid"> 10 <generator class="native"/> 11 </id> 12 <property name="name" column="tname"/> 13 <property name="age" column="tage"/> 14 <property name="score" column="tscore"/> 15 </class> 16 </hibernate-mapping>
其中,约束是在/org/hibernate/hibernate-mapping-3.0.dtd中查找,name是类名和类中的属性名,column是表名和对应的字段名,generator后面再介绍。
(3) 配置住配置文件(hibernate.cfg.xml):
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 <session-factory> 8 <!-- DB连接四要素 --> 9 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="hibernate.connection.url">jdbc:mysql:///mytest?useSSL=false</property> 11 <property name="hibernate.connection.username">root</property> 12 <property name="hibernate.connection.password">248xiaohai</property> 13 <!-- 方言 --> 14 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> 15 <!-- C3P0数据源 --> 16 <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> 17 <!-- 当前Session上下文 --> 18 <property name="hibernate.current_session_context_class">thread</property> 19 <!-- 自动建表 --> 20 <property name="hibernate.hbm2ddl.auto">update</property> 21 <!-- 显示SQL --> 22 <property name="hibernate.show_sql">true</property> 23 <!-- 格式化SQL --> 24 <property name="hibernate.format_sql">true</property> 25 26 <!-- 注册映射文件 --> 27 <mapping resource="com/tongji/beans/Student.hbm.xml"/> 28 </session-factory> 29 </hibernate-configuration>
约束是在/org/hibernate/hibernate-configuration-3.0.dtd种查找的;
DB连接四要素,同JDBC要求(数据库连接的基本要求);
方言,每个数据库管理系统都有自己的方言,每个数据库管理系统的不同版本也有自己的方言,选项在org.hibernate.dialect中查找;
C3P0数据源,数据源是指数据库连接池,由于进行数据库连接比较耗时,系统就建立了一个数据路连接池,其中存放了一定数量的数据库连接,方便需要操作数据库时,直接从这个池中拿取数据库连接。C3P0是其中的一种数据源;
当前Session上下文,指定缓存存放的位置,指定thread,表示将session放在每个线程中;
自动建表,有三个选项:create(每次执行都重新创建表)、update(第一次执行创建表,之后的每次执行都是更新表)、create-drop;
注册映射文件,前面配置的映射文件要在主配置文件中注册;
显示SQL、格式化SQL,主要为了调试,在执行Hibernate程序时,显示底层自动生成的sql语句。
(4) 定义测试类:
1 package com.tongji.test; 2 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.cfg.Configuration; 6 import org.junit.Test; 7 8 import com.tongji.beans.Student; 9 10 public class MyTest { 11 @Test 12 public void testSave() { 13 //1. 加载主配置文件 14 Configuration configure = new Configuration().configure(); 15 //2. 创建Session工厂 16 SessionFactory SessionFactory = configure.buildSessionFactory(); 17 //3. 获取Session 18 Session session = SessionFactory.getCurrentSession(); 19 try { 20 //4. 开启事务 21 session.beginTransaction(); 22 //session.getTransaction().begin(); 同样 23 //5. 操作 24 Student student = new Student("张三", 23, 93.5); 25 session.save(student); 26 //6. 事务提交 27 session.getTransaction().commit(); 28 } catch (Exception e) { 29 e.printStackTrace(); 30 //7. 事务回滚 31 session.getTransaction().rollback(); 32 } 33 } 34 }
注意:session必须在事务之内操作,因为session是操作缓存中的数据,只有提交了事务之后,缓存中的数据才能写到数据库中。