最近有朋友问关于Hibernate的一些问题,抽空的时候做了一个还算比较详细的总结,趁此机会也放在优快云上和大家一起分享
首先我们应该明确一点,Hibernate是对JDBC进行了非常轻量的封装,是一个全自动的ORM(对象关系映射)框架,他可以自动生成SQL语句,也可以自动执行,让我们可以以面向对象的方式操作数据库,完成数据持久化的作用.
那什么是ORM呢?对象-关系映射简称ORM,用来把对象模型表示的对象映射到基于SQL的关系型数据库结构中去,只需要简单的操作实体对象的属性和方法.ORM技术在对象和关系型数据库中间起了一个桥梁的作用,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化.
简单的说就是把我们程序中的实体类和数据库表建立对应关系.
Hibernate的优势:
①.Hibernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率.
②.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO(Data Access Object,数据访问对象)层编码工作.
③.Hibernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系
④.可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展
我们要明确一点:
操作实体类就相当于操作数据库表
下面介绍一下映射文件的编写
映射文件通常是一个XML文件,但一般命名为类名.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="实体类所在包名">
<class name="XXX" table="XXX">
<id name="XXX" column="XXX">
<generator class="native"></generator>
</id>
<property name="XXX" column="XXX"></property>
</class>
</hibernate-mapping>
再来看一下主配置文件:
<?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://localhost:3306/day36_ee48_hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="XXX.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Hibernate的配置文件,包含了连接持久层与映射文件所需的基本信息,其配置文件有两种格式,具体如下:一种是properties属性文件格式的配置文件,它使用键值对的形式存放信息,默认文件名称为hibernate.properties; 另一种是XML格式的配置文件,XML配置文件的默认名称为hibernate.cfg.xml。上述两种格式的配置文件是等价的,具体使用哪个可以自由选择。XML格式的配置文件更易于修改,配置能力更强,当改变底层应用配置时不需要改变和重新编译代码,只修改配置文件的相应属性即可,而properties格式的文件则不具有此优势,因此,在实际开发项目中,大多数情况会使用XML格式的配置文件。
简单介绍一下参数:
名称 | 用途 |
---|
hibernate.dialect | 操作数据库方言 |
hibernate.connection.driver_class | 连接数据库驱动程序 |
hibernate.connection.url | 连接数据库URL |
hibernate.connection.username | 数据库用户名 |
hibernate.connection.password | 数据库密码 |
hibernate.show_sq | 在控制台上输出SQL语句 |
hibernate.format_sql | are neat |
hibernate.hbm2ddl.auto | 当SessionFactory创建时是否根据映射文件自动验证表结构或自动创建、自动更新数据库表结构。该参数的取值为:validate、update、create和create-drop。 |
hibernate.connection.autocommit | 事务是否自动提交 |
Configuration对象
在使用Hibernate时,首先要创建Configuration实例,Configuration实例主要用于启动、加载、管理hibernate的配置文件信息。在启动Hibernate的过程中,Configuration实例首先确定Hibernate配置文件的位置,然后读取相关配置,最后创建一个唯一的SessionFactory实例。Configuration对象只存在于系统的初始化阶段,它将SessionFactory创建完成后,就完成了自己的使命。
Configuration config = new Configuration().configure("xml文件位置");
Configuration config = new Configuration().configure("/config/hibernate.cfg.xml");
加载映射文件
Hibernate除了可以使用Configuration对象加载核心配置文件以外,还可以利用该对象加载映射文件。因为如何使用properties文件作为Hibernate的核心配置文件,其他的属性可以使用key=value的格式来设置,但是映射没有办法加载。这时这个对象就有了用武之地。可以在手动编写代码的时候去加载映射文件。
Configuration configuration = new Configuration().configure("xml文件位置");
configuration.addResource("XXX.hbm.xml");
SessionFactory接口
SessionFactory接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的的数据放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。
SessionFactory的创建:
SessionFactory sessionFactory = config.buildSessionFactory();
sessionFactory对象中维护了很多信息:
①.连接数据库的信息
②.hibernate的基本配置
③.一些预定义的SQL语句
④.hibernate的二级缓存
同时,他是有一个线程安全的对象,所有由该工厂生产的Session对象都共享工厂中维护的数据.
SessionFactory的使用原则:
由于SessionFactory维护了很多信息同时又是线程安全的,一般情况下,一个项目中只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。因此,不应该反复的创建和销毁.也就是说:一个应用应该只有一个SessionFactory。在应用加载时创建,应用卸载时销毁
在hibernate中使用数据源(连接池)
SessionFactory内部还维护了一个连接池,如果我们需要使用第三方的连接池如C3P0,那么需要我们自己手动进行配置
①.导入连接池的jar包
②.在hibernate主配置文件中配置
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
Session
Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。
创建SessionFactory实例后,就可以通过它获取Session实例。获取Session实例有两种方式,一种是通过openSession()方法,另一种是通过getCurrentSession()方法。两种方法获取session的代码如下所示:
Session session = sessionFactory.openSession();
Session session = sessionFactory.getCurrentSession();
以上两种获取session实例方式的主要区别是,采用openSession方法获取Session实例时,SessionFactory直接创建一个新的Session实例,并且在使用完成后需要调用close方法进行手动关闭。而getCurrentSession方法创建的Session实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭。 在没有配置把Session绑定当前线程之前,getCurrentSession方法无法使用,如果要用getCurrentSession获取Session对象,则需要在主配置文件中写:
<property name="hibernate.current_session_context_class">thread</property>
关于Session我们需要注意几个细节:
①.由于SessionFactory已经维护了很多数据,所以Session就维护较少的内容。
②.它是一个轻量级对象。并且:它不是线程安全的!!!!!!!
③.它维护了hibernate的一级缓存
④它的反复创建销毁不会消耗太多资源。