先做一个类,把session封装起来,等用的时候可以直接调用。
public class HibernateUtil { //线程锁,保证线程安全,在用的时候只有这一个session,别人无法处理 private static final ThreadLocal<Session> threadLock = new ThreadLocal<Session>(); //定义常量是为了实现单例,不允许更改赋值 private static final SessionFactory factory = buildFactory(); //写一个buildFactory方法 private static SessionFactory buildFactory() { //读取hibernate.cfg.xml配置,加载数据库和实体类 Configuration cfg = new Configuration().configure(); return cfg.buildSessionFactory(); }
//获取session public static Session getSession(){ //获取上面thredlock中的session Session session = threadLock.get(); //如果thredlock中是空的就新建一个session if(session ==null){ session = factory.openSession(); //将新建的session放入thredlock中 threadLock.set(session); } return session; } //close的方法 public static void closeSession(){ //先获取thredlock中的session Session session = threadLock.get(); //如果不是空,就把session关闭,并且把thredlocal清空 if(session !=null){ session.close(); threadLock.set(null); } } }
然后就可以使用这个封装的session
@Test public void testSelect(){ Session session = null; try{ //有了之前封装的方法 我们就可以直接用.getsession得到一个session session = HibernateUtil.getSession(); //差kc表中所有的 List<Kc> list = session.createQuery("from Kc").getResultList(); for(Kc c : list){
System.out.println(c.getWzName()+" "+c.getPrice()+" "+c.getUnit()); } } catch(Exception e){ e.printStackTrace(); } finally{ HibernateUtil.Closesession(); } } }
这里查完所有的后,打印了物资名称,单价,和单位