一、Hibernate初识
1、ORM:(Object/Relationship Mapping)--对象/关系映射
2、写SQL语句的缺点:
a.不同的数据库使用的SQL语法不同。比如:PL/SQL(oracle数据库)与T/SQL(微软版本)
b.同样的功能在不同的数据库中有不同的实现方式。比如分页SQL,Oracle--rownumber、MySQL---使用关键字limit、SQLServer----还可以使用top关键字
c.程序过分依赖SQL对程序的一直及扩展,维护等带来很大的麻烦。
3、Hibernate是一种能够减少对SQL语句依赖,可行的ORM框架技术。
1)Hibernate简介
Hibernate是java领域的一款开源的ORM框架技术
Hibernate对JDBC进行了非常轻量级的对象封装
2)Hibernate在我们的应用程序中充当着什么样的角色呢?
举例,如下图所示:我们要开发不同的系统
持久化层 --- 处于业务逻辑层和数据库之间的一个角色
作用 -- 把程序中生成的对象持久化到数据库中,换句话说,就是把这些对象通过对象关系映射保存到数据库的表中
3)其他主流的ORM框架技术
①MyBatis: 前身就是著名的iBatis
②Toplink:后被Oracle收购,并重新包装为Oracle AS TopLink
③EJB:本身是JAVAEE的规范
编写Hibernate例子的步骤:
(1)创建Hibernate的配置文件(hibernate.cfg.xml)
(2)创建持久化类
(3)创建对象-关系映射文件
(4)通过HIbernate API编写访问数据库的代码
hibernate必须的jar包:
hibernate-release-4.2.4.Finallib equired;
Mysql的JDBCjar包:mysql-connecttor-java-5.1.7-bin.jar;
Junit4的jar包:junit-4.10.jar
导入hibernate,Junit,mysql的驱动包步骤
1.创建一个普通的java工程
2.构建用户类库:windows --> preferences --> java --> build path --> user libraries --> new...(创建类库文件) --> Add Extra jars...(导入jar包)
3.添加用户类库:在项目名上右键 --> properties --> java build path --> libraries --> Add libraries --> user libraries --> 勾选上 --> 完成
Hibernate配置文档(cfg.xml)
<property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="dialect">org.hibernamte.dialect.MySQLDialect</property> <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">create</property>
编写持久化类(实体类),持久化类的设计原则要遵循javabean的设计原则,设计原则有四点:
1. 这个类是一个公有类
2. 提供公有的不带参数的默认的构造方法
3. 属性要私有化private
4. 属性要用setter/getter封装
创建对象关系映射文件
1.src -> New -> other - > Hibernate -> Hibernate XML Mapping file (hbm.xml) 选择需要映射的刚创建的实体类,会将创建的字段和数据库字段进行映射。
2.在cfg.xml中配置文件声明:<mapping resource="Student.hbm.xml" ></mapping>
使用Junit进行测试
@Before 初始化方法
@Test 测试注释标签
@After 释放资源

/**新版本方法 * 在eclipse中可以查看数据库的,具体步骤:Winows->Show view->other->Data soure Explorer即可。 * 一定要导数据库的jar包。数据库浏览器(Data soure Explorer)的jar包和项目的 * jar包并不能通用,需分别倒入。 * 使用数据库逆向生成实体类的小伙伴,一定要在数据库中设置主键,要不就等着报错吧!!!!!!! */ public class StudentTest { private SessionFactory sessionfactory; private Session session; private Transaction transaction; @Before public void init() { Configuration configuration = new Configuration().configure(); /*注意,并不调用ServiceRegistry方法,而且在新版本中调用该方法有几率会出现一定的错误. 老师讲的课是由实体类直接生成的hbm.xml文件,会在hibernate.cfg.xml中的<session-factory>中生成一个 name属性,即<session-factory name="">,把name属性删除,否则会报错 */ sessionfactory = configuration.buildSessionFactory(); session = sessionfactory.openSession(); transaction = session.beginTransaction(); } @Test public void studentTest() { Student student=new Student(1,"zhanhgsa","man",new Date()); session.save(student); } @After public void destory() { transaction.commit(); session.close(); sessionfactory.close(); } }
二、Hibernate进阶
1.hibernate.cfg.xml常用配置
2.session简介
3.transaction简介
4.session详解
5.对象关系映射常用配置
1、Hibernate常用配置
hibernate.cfg.xml配置文档的常用配置.
程序在运行的时候会读取hibernate.cfg.xml配置文档,从而实现连接数据库,并且生成表结构.
设置了<property name="show_sql">true</property>与<property name="format_sql">true</property>则会把hibernate运行时对数据库的操作时的sql语句会显示在控制台并且格式化.
<property name="hbm2ddl.auto">create</property>即重新删除表结构再创建.所以之前的记录消失.
<property name="hbm2ddl.auto">update</property>它不会删除表结构也不会创建新的表结构,会保留原有的数据,只是更新.没有"hbm2ddl.auto"属性一样也是可以添加新的数据,会保留原有的数据.
<property name="hibernate.default_schema">hibernate</property>则在控制台输出的sql语句中,会在表名之前加上数据库名.
2、session简介
1.不建议直接使用jdbc的connection操作数据库,而是通过session操作数据库。
2.session可以理解为操作数据库的对象,操作数据库之前必须先获取session的实例
3.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
4.把对象保存到关系数据库中需要调用session的各种方法:save(),update(),delete(),createQuery
3、transaction简介
Transaction事务简介:
1. hibernate对数据库的操作都是封装在事务当中的,并且默认是非自动提交的方式。所以用session保存对象时,如果不开启事务并且没有手工提交事务,对象并不会真正保存在数据库中。
2. 如果你想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式(注意:通常并不推荐这样做)
综上,我们必须开启事务。
使用Session的doWork()方法提交事务(需要重写execute()方法,在方法中设置connection自动提交事务)。需要注意的是:在使用save()方法后并不会真正输出sql语句,需要调用flush()强制输出sql语句才可以。然后因为采用了自动提交方式(setAutoCommit(true)),数据才真正保存在数据库。
4、session详解
如何获得session对象?
(1)openSessionion
(2)getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务) <property name="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务) <property name="hibernate.current_session_context_class">jta</property>
1,事务: 事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做
2,JDBC事务:JDBC事务由Connnection对象控制管理,也就是说,事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期。
3,JTA事务:提供了跨数据库连接(或其他JTA资源)的事务管理能力
openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;
getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这是与openSession的区别之一 ;
一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;
openSession与getCurrentSession的区别:
(1)getCurrentSession在事务提交或者回滚之后会自动关闭,而openSesssion需要你手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出!
(2)openSession每次创建新的session对象,getCurrentSession使用现有的session对象
5、对象关系映射常用配置 hbm.xml

<hibernate-mapping schema="schemaName" //模式的名字 catalog="catalogName" //目录的名称 default-cascade="cassade_style" //级联风格 default-access="field/property/CalssName" //访问策略 default-lazy="true/false" //加载策略 package="packagename" //默认包名 /> <class name="ClassName" //对应映射的类 table="tableName" //对应映射数据库的表 batch-size="N" //抓取策略,一次抓取多少记录 where="condition" //条件 eg:抓取条件 entity-name="EntiyName" //如果需要映射多张表 /> <id //表的主键 name="propertyName" //对应的属性 type="typeName" //对应类型 column="column_nam" //映射数据库中表当中字段名的名称 length="length" //指定长度 <generator class="generatorClass">//主键生成策略 />
1、代理主键:是指与业务无关且能唯一标识数据库中记录,一般是数据库自动生成的,比如mysql可以使用auto_increment,Sql2000可以使用identity生成方式,oracle可以使用sequence生成方式。
2、自然主键:指业务相关,由用户指定,且能唯一标识数据库中的任意一条记录。