1.Hibernate框架简介
- Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具
- 理解持久化
- 瞬时状态:
- 理解持久化
在程序运行的时候,有些程序数据保存在内存中,当程序退出后,这些数据就不复存在了,所以,我们称这些数据的状态为瞬时的
- 持久化状态:
在使用一些软件的时候,有些数据,在程序退出后,还以文件等形式保存在硬盘中,那么我们称这些数据的状态时持久的
- 持久化:
持久化就是将程序中的数据在瞬时状态和持久状态之间转换的机制
- ORM
- 对象-关系映射(ORM)
- ORM
能在对象和关系型数据库两者间进行数据转换的机制,处理数据时使用面向对象编程方法,存储数据的时候使用关系型数据库方法.
Hibernate是一个优秀的Java持久化层解决方案,是当今主流对象-关系映射(ORM,ObjectRelationalMapping)工具
Hibernate框架对JDBC进行了封装,简化了数据访问层
2.Hibernate配置
- Hibernate框架下载
- hibernate-distribution-3.3.2.GA-dist.zip
- commons-lang-2.3.jar
- slf4j-api-1.5.8.jar
- log4j-1.2.16.jar
- ojdbc14.jar
- Hibernate配置文件配置
- hibernate.cfg.xml文件
- hibernate.cfg.xml文件
- 添加可持久化类及映射配置文件
- long.hbm.xml
- 在hibernate.cfg.xml中添加映射文件的声明
- 在hibernate.cfg.xml中添加映射文件的声明
- 创建hibernate连接工具类
- hibernate主要接口和类
- Configuration
- SessionFactory:DriverManager(Java)
- Session:Connection(Java)
- Transaction
- Query:Statement和PreparedStatement(Java)
- hibernate主要接口和类
- 通过Hibernate实现增删改查功能(持久化操作),步骤如下:
读取解析配置文件
| Configuration config=new Configuration().configure(); |
读取并解析映射信息,创建SessionFactory
| SessionFactory factory=config.buildSessionFactory(); |
打开session
| this.session=factory.openSession(); |
开始一个事务(增删改操作必须,查询操作可选)
| tran=this.session.beginTransaction(); |
持久化操作
| this.session.save(login); |
提交事务
| tran.commit(); |
关闭session | this.session.close(); |
- 通过Hibernate实现修改功能
public void update(Login login){
tran=this.session.beginTransaction();
this.session.update(login);
tran.commit();
System.out.println("用户信息修改成功!");
this.session.close();
}
public Login queryById(String name){public void delete(Login login){
- 通过Hibernate实现删除功能
tran=this.session.beginTransaction();
this.session.delete(login);
tran.commit();
System.out.println("用户信息删除成功!");
this.session.close();
}
- 通过Hibernate实现主键查询功能
Login login=null;
String hql="From Login AS l WHERE l.username=? ";
Query query=this.session.createQuery(hql);
Iterator<E> iter=query.list().iterator();
if(iter.hasNext()){
login=(Login)iter.next();
}
System.out.println("主键精确查询:");
this.session.close();
return login;
}
public List queryAll(String name){
- 通过Hibernate实现查询所有记录功能
List list=null;
String hql="FROM Login as l";
Query query=this.session.createQuery(hql);
list=query.list();
System.out.println("查询所有记录:");;
this.session.close();
return list;
}
public List queryLike(String name){
- 通过Hibernate实现模糊查询功能
List list=null;
String hql="FROM Login as l WHERE l.username like ?";
Query query=this.session.createQuery(hql);
query.setString(0,"%"+name+"%");
list=query.list();
System.out.println("模糊查询:");;
this.session.close();
return list;
}
- 体系结构
- SessionFactory:
属于单一数据库的编译过的映射文件的一个线程安全的不可变的缓存快照.Session的工厂.
- 会话,Session:
单线程,声明期短促的对象,代表应用程序和持久化层之间的一次对话.封装了一个JDBC连接
- 持久化对象(Persistent Object)及其集合(Collection):
生命短促的单线程对象,包括了持久化状态和商业功能.普通的JavaBean/POJOs.
- 临时对象(Transient Object)及其集合(Collection):
目前没有从属于一个Session的持久化类的实例
- 事务,Transaction:
(可选)单线程,生命期短促的对象,应用程序用它来表示一批工作的原子操作.是底层的JDBC,JTA或者CORBA事务的抽象.
- ConnectionProvider:
(可选)JDBC连接的工厂和池.从底层的Datasource或者DriverManager抽象而来
- TransactionFactory:
(可选)事务实例的工厂
3.Hibernate O/R映射
- Hibernate基本数据类型
- 实体映射
- 在Hibernate中的对象关系映射就是把实体类与数据库中的表相对应,实现实体类中的属性与数据库中的字段一一对应
Java数据类型
|
Hibernate数据类型
|
byte、java.long.Byte
|
byte
|
short、java.lang.Short
|
short
|
int、java.lang.Integer
|
integer
|
long、java.lang.Float
|
float
|
double、java.lang.Double | double |
java.math.BigDecimal | big_decimal |
char、java.lang.Character | character |
boolean、java.lang.Boolean | boolean |
String、java.lang.String
|
string
|
boolean、java.lang.Boolean | yes_no |
boolean、java.lang.Boolean | true_false |
java.util.Date、java.sql.Date | date |
java.util.Date、java.sql.Time | time |
java.util.Date、java.sql.Timestamp | timestamp |
java.util.Calendar | calendar |
byte[] | binary |
java.lang.String | text |
java.io.Serializable | serializable |
java.sql.Clob | clob |
java.sql.Blob | blob |
java.util.Class | class |
java.util.Locale | locale |
java.util.TimeZone | timezong |
java.util.Currency | currency |
- 映射是按照持久化类的定义来创建的,而非表的的定义
- 映射文件配置--Login.hbm.xml
- 映射是按照持久化类的定义来创建的,而非表的的定义
3.使用Hibernate
- 基础语义
- Configuration
- 数据库URL
- 数据库用户
- 数据库用户密码
- 数据库JDBC驱动类
- 数据库dialect,用于特定数据库提供支持,其中包含了针对特定数据库特性的实现
- Configuration
- SessionFactory
- SessionFactory负责创建Session实例,根据当前配置信息创建,配置文件的改变不影响已创建的SessionFactory,除非再创建新的SessionFactory
- SessionFactory
- Session
- 相当于JDBC中的Connection,通过SessionFactory创建
- Session
- 通过调用Session所提供的save,find,flush等方法完成持久层操作
- 事务管理
- Hibernate是JDBC的轻量级封装,本身不具备事务管理能力
- Hibernate将事务管理委托给底层的JDBC或者JTA
- 基于JDBC的事务管理
- 基于JTA的事务管理
- JTA提供了跨Session的事务管理能力
- JTA事务管理则由JTA容器实现,JTA容器对当前加入事务的众多Connection进行调度
- JTA的事务周期可横跨多个JDBC Connection生命周期
- JTA事务是由JTA Container维护,而参与事务的Connection无需对事务进行干涉
- 基于JTA的事务管理
- 锁机制
- 悲观锁(Pessimistic Locking)
- LockMode.NONE:无锁机制
- LockMode.RWRITE:Hibernate在Insert和Update记录的时候会自动获取
- LockMode.READ:Hibernate在读取记录的时候会自动获取
- LockMode.UPGRADE:利用数据库的for update子句加锁
- LockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的for update nowait子句实现功能
- Criteria.setLockMode
- Query.setLockMode
- Session.lock
- 加锁实现方式:
- Criteria.setLockMode()
- Query.setLockMode()
- Session.lock()
- 悲观锁(Pessimistic Locking)
- 锁机制
- 乐观锁(Optimistic Locking)
- 采取了比悲观锁更宽松的加锁机制
- 大多是基于数据库版本(Version)记录机制实现,而悲观锁则是倚靠数据库的锁机制实现,以保证最大程度的独占性
- 避免了长事务中的数据库加锁开销
- 往往基于系统中的数据存储逻辑,有一定的局限性
- Hibernate的数据访问殷勤重内置了乐观锁实现
- 乐观锁(Optimistic Locking)