zoukankan      html  css  js  c++  java
  • Hibernate-ORM:09.Hibernate中的getCurrentSession()

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

    本篇博客将讲述,以优雅的方式创建session对象,我将会说明优点,并提炼成工具类

    优点:

      1.无需手动关闭session

      2.提高了性能,不需要频繁的创建session对象

    说明:

      虽然getCurrentSession()底层调用了openSession(),但是做了单例操作,所以性能更高,更安全

    工具类:

    package cn.dawn.util;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    /**
     * Created by Dawn on 2018/5/30.
     */
    public class SessionFactoryUtil {
        private static Configuration configuration;//加载核心配置文件
        private static SessionFactory factory;//单例对象
    
        //在类加载的时候,加载静态代码块
        static {
            configuration=new Configuration().configure();//默认加载根目录下的hibernate.cfg.xml
            factory=configuration.buildSessionFactory();
        }
    
        //通过sessionfactory创建session
        /*设置同步,保证线程安全*/
        public static synchronized Session getCurrentSession(){
            return factory.getCurrentSession();
            /*不能直接使用,需要在核心配置文件中加入一个节点*/
            /*<property name="current_session_context_class">thread</property>*/
        }
    }

    另外需要在hibernate.hbm.xml中配置一个节点

    <property name="current_session_context_class">thread</property>

    简单的使用案例:

    package cn.dawn.day03;
    
    import cn.dawn.day03.entity.Teacher;
    import cn.dawn.util.SessionFactoryUtil;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.query.Query;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.util.List;
    
    /**
     * Created by Dawn on 2018/5/25.
     */
    /*分页*/
    public class Test0120180530Page {
        /*事物*/
        Transaction tr=null;
        /*session*/
        Session session=null;
    
    
    
    
        @Test
        /**
         * 分页
         *
         * 01.查询总记录数
         * 02.每页显示的数据
         * 03.总页数
         */
        public void t1Page(){
            String hql="select count(*) from Teacher";//会返回Long类型
            int counts=((Long)session.createQuery(hql).uniqueResult()).intValue();
            /*页大小*/
            int pageSize=2;
            /*总页数*/
            int totalPages=(counts%pageSize==0)?(counts/pageSize):(counts/pageSize+1);
            /*显示第二页内容*/
            int pageIndex=2;
            hql="from Teacher";
            Query query = session.createQuery(hql);;
            /*从哪一条开始查*/
            query.setFirstResult((pageIndex-1)*pageSize);
            /*设置页大小*/
            query.setMaxResults(pageSize);
            List<Teacher> teachers = query.list();
            for (Teacher t:teachers) {
                System.out.println(t);
            }
    
        }
    
    
        /*在执行之前加载配置,运行事物*/
        @Before
        public void beforeTest(){
    
            /*使用工具类*/
            /*创建session*/
            session = SessionFactoryUtil.getCurrentSession();
            /*创建事物*/
            tr = session.beginTransaction();
        }
    
        /*在执行之后,提交事物,关闭session*/
        @After
        public void afterTest(){
            /*提交事物*/
            /*tr.commit();*/
            /*关闭session*/
            /*session.close();*/
        }
    }
  • 相关阅读:
    Input file 调用相机
    C#读取txt文件
    高并发下获取随机字符串
    将Datatable转换为Json数据
    System.IO.Path 获得文件的后缀名
    用Js写的贪吃蛇游戏
    C#中的事件
    通过一个控制台小Demo--算术题,来展示C#基本的程序结构
    数据库高级应用之游标
    数据库高级应用之事务
  • 原文地址:https://www.cnblogs.com/DawnCHENXI/p/9121074.html
Copyright © 2011-2022 走看看