1.1 Hibernate的概述
Hibernate是当今主流的Java数据持久层的框架之一,Hibernate是一个免费开源的ORM(Object Relational Mapping 对象关系模型)框架,Hibernate对JDBC进行了轻量级的封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。
1.2 Hibernate的好处
Hibernate对JDBC访问数据库的代码进行了轻量级的封装,大大的简化了数据访问层繁琐的的重复性代码,并且减少了内存消耗,加快了运行效率。
1.3 Hibernate入门
1.3.1 下载Hibernate5
下载: https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
- document 文件夹:存放Hibernate的相关文档,包括参考文档的API文档。
- lib 文件夹:存放Hibernate编译和运行所依赖的jar包。其中required子目录下包含了运行Hibernate5项目必须的JAR包。
- project 文件夹 : 存放Hibernate各种相关的源代码。
1.3.2 Hibernate项目需要的jar包
数据库驱动包、Hibernate/lib/required/*.jar、日志记录的包
1.3.3 创建实体类(持久化类)
hibernate使用普通Java对象(Plain Oid Java Object), 即POJO的编程模式来进行持久化。POJO类包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法来访问。
1.3.4 映射文件的配置
<?xml version="1.0" encoding="utf-8" ?>
<!-- 映射文件的dtd信息 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.yyh.hibernate.pojo">
<!-- name是实体类名,table是表名 -->
<class name="Customer" table="cst_customer">
<!-- name是类中的id属性 column是表中的id字段 -->
<id name="cust_id" column="cust_id">
<!-- 主键生成策略 -->
<generator class="native"></generator>
</id>
<!-- 其他属性使用property标签来映射 -->
<property name="cust_name" column="cust_name"></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry" column="cust_industry"></property>
<property name="cust_level" column="cust_level"></property>
<property name="cust_linkman" column="cust_linkman"></property>
<property name="cust_phone" column="cust_phone"></property>
<property name="cust_mobile" column="cust_mobile"></property>
</class>
</hibernate-mapping>
映射文件通常是一个XML文件,一般命名为类名.hbm.xml,与实体类放在同一个目录下
1.3.5 核心配置
- 一种是properties属性文件格式的配置文件,它使用键值对的形式存放信息,默认文件名称为hibernate.properties;
- 另一种是XML格式的配置文件,XML配置文件的默认名称为hibernate.cfg.xml 上述两种格式的配置文件是等价的,具体使用哪个可以自由选择。XML格式的配置文件更容易修改,配置能力强,当改变底层应用配置时不需要改变和重新编译代码,只修改配置文件的相应属性即可,而properties格式的文件则不具有此优势,因此,在实际开发项目中,大多数情况会使用XML格式的配置文件。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否在控制台输出SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 是否在控制台按格式输出SQL语句 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate的hbm2dd1( 数据库定义语言:create、drop、alert ... -->
<!--
hbm2dd1.auto的值:
* none : 不用Hibernate自动生成表
* create : 每次都会创建一个新的表(测试用)
* create-drop : 每次都会创建一个新的表,执行程序结束后删除这个表(测试用)
* update : 如果数据库有表,使用数据库中的表,如果没有,创建一个新表,可以更新表结构
* validate : 只会使用原有的表,对映射关系进行校验。
-->
<property name="hibernate.hbmadd1.auto">update</property>
<!-- Hibernate加载映射 -->
<mapping resource="com/yyh/hibernate/pojo/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
配置文件的dtd信息,可以在核心包hibernate-core-5.0.7.Final.jar下的org.hibernate包中的hibernate-configuration-3.0.dtd文件中找到。
1.3.6 Hibernate的相关API
1.3.6.1 Configuration: 配置对象
Configuration config = new Counfiguration().configure("配置文件xml的位置");
此种写法hibernate会去指定位置查找匹配文件,例如想要使用src下config包中hibernate.cfg.xml文件,只需将文件位置加入configure()中即可
Configuration config = new Configuration().configure(“/config/hibernate.cfg.xml”);
1.3.6.2 SessionFactory : Session工厂对象
SessionFactory接口负责Hibernate的初始化和建立Session对象。它在hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的数据放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。SessionFactory sessionFactory = config.buildSesssionFactory();
SessionFactory具有以下特点:
public class HibernateUtils {
private static SessionFactory sessionFactory;
static {
Configuration config = new Configuration().configure();
sessionFactory = config.buildSessionFactory();
}
// 提供获得Session的方法
public static Session openSession() {
return sessionFactory.openSession();
}
}
1.3.6.3 Session
Session是应用程序中与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
获得Session实例有两种方式:
// 采用openSession方法创建对象
Session session = sessionFactory.openSession();
// 采用getCurrentSession()方法创建对象
Session session = sessionFatory.getCurrentSession();
这两种创建方式的主要区别是:
-- openSession是直接创建一个新的Session实例,并且在使用完成后需要调用close方法进行手动关闭。
-- getCurrentSession是创建的Session实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭。
Session是线程不安全的,多个并发线程同时操作一个Session实例是,就可能导致Session数据存取的混乱(方法内部定义和使用Session时,不会出现线程问题)
1.3.6.4 Transaction
Transaction接口主要用于管理事务,它是Hibernate的数据库事务接口,且对底层的事务接口进行了封装。Transaction接口的事务对象是通过Session对象开启的。
Transaction tx = session.beginTransaction();
在Transaction接口中,提示了事务管理的常用方法,具体如下:
-- commit()方法: 提交相关联的session实例
-- rollback()方法: 撤销事务操作
Session执行完数据库操作后,要使用Transaction接口的commit()方法进行是事务提交,才能真正的将数据操作同步到数据库中。发生异常时,需要使用rollback()方法进行事务回滚,以避免数据发生错误。