JavaEE 学习专题ThoughtWorks欧亚创新工作室程序员

Hibernater学习笔记(三)

2017-12-08  本文已影响45人  Mr_欢先生

1.Hibernate缓存

验证一级缓存
如果没有缓存,两次查询,会有两次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();
    }
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();
    }
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.

3.获取与本地线程绑定的session

<!--hibernate核心配置文件中配置绑定session-->
        <property name="hibernate.current_session_context_class">thread</property>
 public static Session getSessionObject(){
        return sessionFactory.getCurrentSession();
    }

4.Hibernate的api使用

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 <User> 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();
        }
}

使用这种对象查询操作,但是使用这个对性爱那个时候,不需要写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 <User> 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();
        }
    }

使用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 <User> 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框架学习

上一篇 下一篇

猜你喜欢

热点阅读