1.Hibernate缓存
- Hibernate一级缓存
- hibernate 的一级缓存默认是打开的
- hibernate的一级缓存使用范围,是session范围,从session创建到session关闭范围
- hibernate的一级缓存中,储存数据必须持久态数据
- hibernate二级缓存
- 目前已经不在使用,替代技术redis
- 二级缓存默认不是打开的,需要配置
- 二级缓存使用范围,是sessionFactory范围
验证一级缓存
如果没有缓存,两次查询,会有两次sql语句打印,测试结果打印出来一条sql,说明第二次查询是在一级缓存里查到的。
public void testCasch(){
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class,3);
System.out.println(user);
User user2 = session.get(User.class,3);
System.out.println(user2);
transaction.commit();
session.close();
sessionFactory.close();
}
hibernater一级缓存特性:持久态自动更新数据库
提交事务后,虽然没有写session.update(user);
,但是会比较一级缓存内容和对应的快照区内容是否相同,如果不相同,把一级缓存的内容更新到数据库
public void testupdate(){
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class,3);
user.setUsername("修改名称");
//session.update(user);
transaction.commit();
session.close();
sessionFactory.close();
}
2.Hibernate事务代码规范写法
public void testselect(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction transaction=null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
User user = new User();
user.setUsername("小马");
user.setPassword("45465");
user.setAddress("陕西");
session.save(user);
transaction.commit();
}catch(Exception e){
e.printStackTrace();
transaction.rollback();
}finally {
session.close();
sessionFactory.close();
}
}
3.Hibernate绑定session
1.session类似于jsbc的connection,之前学过的threadLocal。
2.帮实现本地线程绑定session.
- Session在第一次被使用的时候,或者第一次调用getCurrentSession()的时候,其生命周期就开始。然后它被Hibernate绑定到当前线程。当事务结束的时候,不管是提交还是回滚,Hibernate也会把
Session从当前线程剥离,并且关闭它。假若你再次调用getCurrentSession(),你会得到一个新的Session,并且开始一个新的工作单元。得到的Session总是当前线程的Session,这就是所谓的线程绑定
3.获取与本地线程绑定的session
- a.在hebernate核心配置文件中配置
thread
- b.调用sessionFactory里面的方法得到
public static Session getSessionObject(){
return sessionFactory.getCurrentSession();
}
- 写了与本地线程绑定的session,不需要手动关闭,否则会出现session was closed 错误
4.Hibernate的api使用
- Query对象
1.使用query对象,不需要写sqll语句,但是写hql语句。
a.hql:hibernate query language ,hibernate提供查询语言,这个hql语句和普通的sqll语句很相似
b.hql和sql区别:
使用sql操作表和字段
使用hql操作实体类和属性
2.查询所有hql语句
(1)from 实体类名称
public void testQuery(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction transaction=null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
Query query = session.createQuery("from User");
List list = query.list();
for(User user:list){
System.out.println(user);
}
transaction.commit();
}catch(Exception e){
e.printStackTrace();
transaction.rollback();
}finally {
session.close();
//项目中不需要关闭
sessionFactory.close();
}
}
- Criteria对象
使用这种对象查询操作,但是使用这个对性爱那个时候,不需要写sql语句,直接调用方法实现。
public void testCriteria(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction transaction=null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(User.class);
List list = criteria.list();
for(User user:list){
System.out.println(user);
}
transaction.commit();
}catch(Exception e){
e.printStackTrace();
transaction.rollback();
}finally {
session.close();
//项目中不需要关闭
sessionFactory.close();
}
}
- SQLQuery对象
使用hibernate时,调用底层sql实现
public void testSQLQuery(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction transaction=null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
SQLQuery sqlQuery = session.createSQLQuery("select * from h_user");
//查询出来的是数组,转为实体类
sqlQuery.addEntity(User.class);
List list = sqlQuery.list();
for(User user:list){
System.out.println(user);
}
transaction.commit();
}catch(Exception e){
e.printStackTrace();
transaction.rollback();
}finally {
session.close();
//项目中不需要关闭
sessionFactory.close();
}
}
上一篇:Hibernater学习笔记(二)
当前文集 :Hibernate框架学习