------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本篇博客将讲述,以优雅的方式创建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();*/ } }