Hibernater学习笔记(三)

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学习笔记(三)_第1张图片
image.png

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();
    }
Hibernater学习笔记(三)_第2张图片
image.png

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学习笔记(三)_第3张图片
查询结果

上一篇:Hibernater学习笔记(二)

当前文集 :Hibernate框架学习

你可能感兴趣的:(Hibernater学习笔记(三))