------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
本篇博客将讲述,以优雅的方式创建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(); /*不能直接使用,需要在核心配置文件中加入一个节点*/ /*thread */ }}
另外需要在hibernate.hbm.xml中配置一个节点:
thread
简单的使用案例:
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); Listteachers = 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();*/ }}