一、Hibernate:是一个开放源代码的对象关系映射框架,对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,用于Java代码和数据库之间的交互。
1、核心:Java和数据库之间的映射关系。
2、hibernate的缓存:
a)、一级缓存:hibernate首次查询之后会将查询结果存放在一级缓存中,第二次查询的时候会直接从缓存中获取数据,如果缓存中没有采去查询数据库。hibernate自带一级缓存。
b)、二级缓存:把运行结果存储在硬盘上,执行的时候先从一级缓存中去找,如果没有找到就去二级缓存,二级缓存需要借助第三方插件。
3、配置方法:
A)、在lib目录下加载Hibernate所需的jar包
B)、创建一个与数据库相对应的类(package的名字为bean)
C)、配置数据库中的表的字段与类中的各个字段之间的对应关系(.xml文件配置或者用注解的方式配置)
D)、往src目录下复制一个hibernate.cfg.xml文件,并在该文件中添加相应的映射文件或者是映射类。(注意不能添加多余的映射路径,否则会报错)
E)、在某个方法中编写对数据库的操作语言:
a)、创建Configurration对象读取hibernate的配置文件
b)、创建sessionFactory工厂类,并通过openSession()方法获取session(即创建一次会话)
c)、创建一个实例(查询和更新的时候需要)
d)、开启实物(增删改)
e)、设置session的任务
f)、提交实物(增删改)
二、搭建一个简单的Hibernate框架(.xml):
1、创建一个web项目,将Hibernate框架所需的jar包拷贝到lib目录下。
2、封装一个HibernateTools工具类,简化对数据库操作时的代码。以后可以直接粘贴调用。
1 /** 2 * 3 * 项目名称:ccc 4 * 类名称: HibernateTools 5 * 描述: -HibernateTools工具类 6 * 修改时间: 7 * 修改备注:- 8 */ 9 public class HibernateTools { 10 11 // 声明一个工厂类 12 private static SessionFactory sf; 13 //线面这句是一个静态代码块,在应用程序启动的时候就会执行,而且只会执行一次 14 static{ 15 //1、创建Configuration对象,用于读取xml文件 16 Configuration conf = new Configuration(); 17 conf.configure("/hibernate.cfg.xml"); 18 // 2、通过buildSessionFactory()创建SessionFactory的工厂类 19 sf = conf.buildSessionFactory(); 20 } 21 22 public static Session openSession(){ 23 // 3、通过openSession()获取一个会话 24 return sf.openSession(); 25 } 26 }
3、创建一个StudentBean类
1 package com.st.bean; 2 3 public class StudentBean { 4 private int snum; //学号 5 private String sname;//姓名 6 private int sage; //年龄 7 public int getSnum() { 8 return snum; 9 } 10 public void setSnum(int snum) { 11 this.snum = snum; 12 } 13 public String getSname() { 14 return sname; 15 } 16 public void setSname(String sname) { 17 this.sname = sname; 18 } 19 public int getSage() { 20 return sage; 21 } 22 public void setSage(int sage) { 23 this.sage = sage; 24 } 25 }
4.拷贝一个xxx.hbm.xml文件到com.st.bean目录下,重命名为student.hbm.xml,并修改class标签中的属性:使Student表与StudentBean类之间存在映射关系:
1 <?xml version="1.0"?> 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.st.bean.StudentBean" table="STUDENT"> 9 <id name="snum" column="SNUM"> 10 <generator class="assigned"></generator> 11 </id> 12 <property name="sname" column="SNAME"></property> 13 <property name="sage" column="SAGE"></property> 14 </class> 15 </hibernate-mapping> 16 <!-- 类和数据库表之间的映射关系: 17 <calss name="Java类" table="数据库表"> 18 <id name="Java类的字段" column="表里面的字段"> 19 <generator class="主键生成规则" ></generator> 20 </id> 21 <property name="Java类的字段" column="数据库表的字段" type="java.lang.String"></property> 22 简单的一对多 Java类里面一的一方需要有 多的一方的一个 set集合 23 <set name="类里面的集合的 变量名" cascade="all" inverse="true" > 24 <key cloumn=""></key> 25 <one-to-many class="多方的类的地址"> 26 </set> 27 多的一方 在Java类里面 写一个 一的一方的对象 28 <many-to-one name="对象的变量名" column=""> 29 多对多 :Java类里面都有 另一方的一个 set集合 30 <set name="类里面的集合的 变量名" table="中间表的表名" cascade="all" inverse="true"> 31 <key column="本类的表 和第三方表的关联字段"></key> 32 <many-to-many class="另一个对象的地址" column="另一对象对应的表和第三方表的关联字段"> 33 </set> 34 35 </class> 36 -->
5、拷贝一个hibernate.cfg.xml文件到src文件下,删除hibernate.xml文件中无用的映射文件后,添加映射文件-student.hbm.xml。
1 <!DOCTYPE hibernate-configuration PUBLIC 2 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 4 5 <hibernate-configuration> 6 <session-factory> 7 <property name="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</property> 8 <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 9 <property name="hibernate.connection.username">scott</property> 10 <property name="hibernate.connection.password">tiger</property> 11 <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> 12 13 <!-- 显示SQL,默认为false --> 14 <property name="hibernate.show_sql">true</property> 15 16 <!-- 添加一个映射文件 --> 17 <mapping resource="com/st/bean/student.hbm.xml"/> 18 </session-factory> 19 </hibernate-configuration>
6、在新建一个StudentTest类,在里面即可编写相应的增删改查的代码:
1 package com.st.test; 2 3 import java.util.List; 4 5 import org.hibernate.Criteria; 6 import org.hibernate.Session; 7 import org.hibernate.Transaction; 8 import org.hibernate.criterion.Restrictions; 9 import org.junit.Test; 10 11 import com.st.Tools.HibernateTools; 12 import com.st.bean.StudentBean; 13 14 public class StudentTest { 15 16 /* 17 * 添加一组数据 18 */ 19 @Test 20 public void test1(){ 21 // 获取一个会话 22 Session session = HibernateTools.openSession(); 23 //开启一次事物 24 Transaction tran = session.beginTransaction(); 25 StudentBean student =new StudentBean(); 26 //student.setSnum(21);//设置为主键自增长时不用指定主键的值; 27 student.setSname("李冬林"); 28 student.setSage(22); 29 session.save(student); 30 //确认提交事物 31 tran.commit(); 32 } 33 /* 34 * 删 35 */ 36 @Test 37 public void test2(){ 38 // 获取一个会话 39 Session session = HibernateTools.openSession(); 40 Transaction tran = session.beginTransaction(); 41 StudentBean student = new StudentBean(); 42 student.setSnum(28); 43 session.delete(student); 44 tran.commit(); 45 } 46 /* 47 * 改 48 */ 49 @Test 50 public void test3(){ 51 // 获取一个会话 52 Session session = HibernateTools.openSession(); 53 Criteria c = session.createCriteria(StudentBean.class); 54 //开启一次事物 55 Transaction tran = session.beginTransaction(); 56 57 c.add(Restrictions.eq("snum", 30)); 58 //获取这个条件的原有数据 59 StudentBean student =(StudentBean) c.uniqueResult(); 60 student.setSage(21); 61 student.setSname("陈泽俊"); 62 session.update(student); 63 tran.commit(); 64 } 65 /* 66 * 查 67 */ 68 @Test 69 public void test4(){ 70 // 获取一个会话 71 Session session = HibernateTools.openSession(); 72 //创建一个条件 73 Criteria c = session.createCriteria(StudentBean.class); 74 //c.add(Restrictions.eq("snum",30)); 75 List<StudentBean> list = c.list(); 76 for(StudentBean a: list){ 77 System.out.println(a.getSnum()+"---"+a.getSname()+"---"+a.getSage()); 78 } 79 } 80 }
二、用注解的方式搭建一个简单的Hibernate框架:
1、在上面的基础上再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar
2、同第一种方法
3、创建一个StudentBean类,并在这个类上添加注解(注意:注解引的包是:javax.persistence.*不是org.hibernate.annotations.*)
1 package com.st.bean; 2 3 import javax.persistence.Column; 4 import javax.persistence.Entity; 5 import javax.persistence.GeneratedValue; 6 import javax.persistence.Id; 7 import javax.persistence.Table; 8 9 import org.hibernate.annotations.GenericGenerator; 10 11 12 13 @Entity //声明一个实体 14 @Table(name="student") //与表之间的映射 15 @GenericGenerator(name="genId",strategy="increment")//声明主键生成方式为自增长 16 public class StudentBean { 17 @Id 18 @GeneratedValue(generator = "genId") //指定主键生成策略 19 @Column(name="SNUM") //snum与表里的SUM字段相对应 20 private int snum; //学号 21 @Column(name="SNAME") 22 private String sname;//姓名 23 @Column(name="SAGE") 24 private int sage; //年龄 25 26 27 public int getSnum() { 28 return snum; 29 } 30 public void setSnum(int snum) { 31 this.snum = snum; 32 } 33 public String getSname() { 34 return sname; 35 } 36 public void setSname(String sname) { 37 this.sname = sname; 38 } 39 public int getSage() { 40 return sage; 41 } 42 public void setSage(int sage) { 43 this.sage = sage; 44 } 45 }
4.拷贝一个xxx.hbm.xml文件到com.st.bean目录下,重命名为student.hbm.xml,并修改class标签中的属性:使Student表与StudentBean类之间存在映射关系:
1 <!DOCTYPE hibernate-configuration PUBLIC 2 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 4 5 <hibernate-configuration> 6 <session-factory> 7 <property name="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</property> 8 <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 9 <property name="hibernate.connection.username">scott</property> 10 <property name="hibernate.connection.password">tiger</property> 11 <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> 12 13 <!-- 显示SQL,默认为false --> 14 <property name="hibernate.show_sql">true</property> 15 16 <!-- 添加一个映射文件 --> 17 <mapping class ="com.st.bean.StudentBean"/> 18 </session-factory> 19 </hibernate-configuration>
5、同上面第6步。