1、Hibernate概念
Hibernate 是基于javaEE平台的一种开放源代码的ORM框架技术。
是对JDBC的封装,向业务层提供了更加面向对象的API,而操作的对象
是域模型对象(POJO)。Hibernate 要求对javabean提供一个不带参数的构造方法
2、hibernate的体系架构图
3、Hibernate 的核心API(5个)
Configuration 接口:用于Hibernate配置,在Hibernate启动的时候读取配置文件,创建一个SessionFactory对象。
SessionFactory 接口:用来产生Session对象,一个SessionFactory对象代表一个数据库连接。他是线程安全的,他所拥有的信息(二级缓存,不是必须的)被客户用户所共享。
Session 接口:用于对数据进行持久化操作。相当于持久化对象在内存中的一个缓冲区(一级缓存,必须的)。他是线程不安全的,hibernate会自动检测缓冲区中持久化对象的是否已经被改变并及时进行刷新,以保证数据的同步性。
Transaction 接口:是Hibernate API通过操作底层事务(如:JDBC事务管理、JTA)来达到管理事务的目的。
Query/Criteria 接口:提供对数据的查询方法。
五个接口之间的关系是:
Configuration ------> SessionFactory -------> Session -------->【Transaction、Query / Criteria】
4、简单案例
hibernate.cfg.xml配置
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 配置数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 配置是否显示sql语言 -->
<property name="show_sql">true</property>
<!-- 自动生成表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 引入映射文件 -->
<mapping resource="com/liusheng/models/Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
模型类对象关系映射文件Person.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "com.liusheng.models.Person" table="person">
<id name = "id" column = "id" type="int">
<!-- 主键生成方式,由hibernate 生成主键,id元素为必须的 -->
<generator class="increment"></generator>
</id>
<property name="name" column = "name" type = "string"></property>
<property name="pass" column = "pass" type = "string"></property>
<property name="birthday" column = "birthday" type = "date"></property>
</class>
</hibernate-mapping>
关键代码:
//构建配置对象,加载配置文件信息
Configuration cfg = new Configuration().configure();
//创建SessionFactory对象
SessionFactory factory = cfg.buildSessionFactory();
//获取数据操作对象session
Session session = factory.openSession();
//获得事务对象
Transaction tx = session.beginTransaction();
//利用session对象进行数据查询(利用OID进行查询)
Object o1 = session.get(Person.class,new Integer(1));
Object o2 = session.load(Person.class,new Integer(2));
//利用HQL进行数据查询
Query query = session.createQuery(“from Person”);
List list = query.list();
Iterate iterate = query.iterate();
5、方法比较
session.get() 他首先会查询一级缓存,没有的话二级缓存,最后再查询数据库。 如果没有就返回null,是一种立即加载。 session.load() 他首先查询一级缓存,如果没有创建一个代理对象。在实际使用的时候没有就再去 查询二级缓存,最后再查询数据。再没有就会抛出异常。load()方法认为要查询的 对象一定存在,所以使用了代理对象来达到延迟加载的目的。 |
query.list() 首先查询一级缓存,没有的话二级缓存,最后再查询数据库。 他返回的是完整数据对象的集合,没有就返回null.立即加载。 产生的sql:select * from person; query.iterate() 首先查询一级缓存,没有的话二级缓存,最后再查询数据库。 他返回的是数据对象的OID集合,当真正使用的时候,他在 针对每一个对象进行数据查询此时返回的才是完整的数据对象。 都没有就返回null,是一种延迟加载。 产生的sql: 首次返回OID集合 select id from person; 真正使用时在查询每个对象select p.id,p.name from person p where id = 1; |
通过上面的比较发现:
使用了get()与list()会立即返回完整对象,所以当session关闭后可以直接使用
而load()与iterate()则分别通过生成代理对象与返回OID对象集合的方式达到延迟
加载的目的。当session关闭后再去使用这些对象,由于他们这时才会真的去查询出完整
对象,所以就会抛出session关闭的异常。再有使用了iterate将会产生多条sql,进行
影响性能.