一、 概述
ORM :Object Relation Mapping 对象关系映射。
Hibernate:开放源代码的ORM框架,对JDBC进行了轻量级的对象封装。
Crud :增删改Create、Retrieve、Update、Delete
主要被用在描述软件系统中数据库或者持久层的基本操作功能。
Session :是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,它的主要功能是为持久化对象提供创建、读取和删除的能力,所有持久化对象必须在session的管理下才可以进行持久化操作。Session接口负责执行被持久化对象的crud操作,线程不安全。
OID:Object identifier, OID对象标识符,OID字段即主键
JTA:即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。一个分布式事务(distributedtransaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。
QBC:Query By Criteria
JPA:Java Persistence API。是SUN公司推出的一套基于ORM的规范。hibernate框架中提供了JPA的实现。JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
二、
1、在使用Hibernate时,首先要创建Configuration实例,Configuration实例主要用于启动、加载、管理hibernate的配置文件信息。
2、SessionFactory接口负责Hibernate的初始化和建立Session对象。它在Hibernate中起到一个缓冲区作用,Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的的数据放在这个缓冲区中。线程安全。
3、SessionFactory内置了一个连接池,hibernate.connection.provider_class
三、get和load的区别
1、查询的时机不一样
get方法任何时候都是立即加载,即只要一调用get马上发起数据库查询
load方法默认情况下是延迟加载,即真正用到对象的非OID字段数据才发起查询
load方法可以通过配置的方式改为立即加载。
配置的方式:
由于load方法是hibernate的方法所以只有XML的方式:
<classname="Customer" table="cst_customer"lazy="false">
2、返回的结果不一样
get方法永远返回查询的实体类对象。
load方法当是延迟加载时,返回的是实体类的代理对象。
四、Hibernate的一级缓存
就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用Hibernate查询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行查找,如果找到匹配OID值的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库;如果没有找到相同OID值的对象,则会去数据库中查找相应数据。当从数据库中查询到所需数据时,该数据信息也会放置到一级缓存中。Hibernate的一级缓存的作用就是减少对数据库的访问次数。
Hibernate 向一级缓存放入数据时,同时复制一份数据放入到Hibernate快照中,当使用commit()方法提交事务时,同时会清理Session的一级缓存,这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生变化,则执行update语句,将缓存的内容同步到数据库,并更新快照;如果一致,则不执行update语句。
Hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致。
五、对象的三种状态
1、 瞬时态(transient)
不存在持久化标识OID(相当于主键值),尚未与Hibernate Session关联
2、 持久态(persistent)
存在持久化标识OID ,加入到了Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录
3、 脱管态(detached)
脱管态对象存在持久化标识OID,并且仍然与数据库中的数据存在关联,只是失去了与当前Session的关联
六、
短语 |
含义 |
Restrictions.eq |
等于= |
Restrictions.allEq |
使用Map,使用key/value进行多个等于的判断 |
Restrictions.gt |
大于> |
Restrictions.ge |
大于等于>= |
Restrictions.lt |
小于< |
Restrictions.le |
小于等于<= |
Restrictions.between |
对应sql的between子句 |
Restrictions.like |
对应sql的like子句 |
Restrictions.in |
对应sql的in子句 |
Restrictions.and |
and 关系 |
Restrictions.or |
or关系 |
Restrictions.sqlRestriction |
Sql限定查询 |
Restrictions.asc() |
根据传入的字段进行升序排序 |
Restrictions.desc() |
根据传入的字段进行降序排序 |
运算类型 |
HQL运算符 |
QBC运算方法 |
比较运算 |
= |
Restrictions.eq() |
<> |
Restrictions.not(Restrictions.eq()) | |
>= |
Restrictions.ge() | |
< |
Restrictions.lt() | |
<= |
Restrictions.le() | |
is null |
Restrictions.isNull() | |
is not null |
Restrictions.isNotNull() | |
范围运算符 |
in |
Restrictions.in() |
not in |
Restrictions.not(Restrictions.in()) | |
between |
Restrictions.between() | |
not between |
Restrictions.not(Restrictions.between()) | |
HQL运算符 |
QBC运算方法 | |
like |
Restrictions.like() | |
and |
Restrictions.and()| Restrictions.conjunction() | |
or |
Restrictions.or()| Restrictions.disjunction() | |
not |
Restrictions.not() |