• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Foreordination
酒后高歌磨剑,梦中快意恩仇,名利脚下踩,情义两肩挑
博客园    首页    新随笔    联系   管理    订阅  订阅
五、持久层框架(Hibernate)

一、分页查询

  使用Criteria进行分页查询,无论是使用Oracle,MySQL,NoSQL,DB2,分页查询的代码写法都相同。

分页查询代码示例:

package com.demo.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;

import com.demo.pojo.Product;

public class TestHibernate{
    public static void main(String[] args){
        SessionFactory sf=new Configuration().configure().buildSessionFactory();
        Session session=sf.openSession();
        session.beginTransaction();
        
        String name="demo";
        Criteria c=session.createCriteria(Produt.class);
        c.add(Restriction.like("name","%"+name+"%"));
        c.setFirstResult(2);//从第二条数据开始
        c.setMaxResults(5);//一共查询5条数据
        
        List<Product> list=c.list();
        for(Product p:list){
            System.out.println(p.getName()+"\t");
        }
        
        session.getTransaction().commit();
        session.close();
        sf.close();
    }
}
View Code

二、Hibernate获取session的两种方式

1、openSession和getCurrentSession

区别:

1.1、获取的是否是同一个session对象

openSession:每次会得到新的Session对象

getCurrentSession:在同一个线程中,每次都获取相同的Session对象。在不同的线程中,获取的是不同的Session对象。

1.2、事务提交的必要性

openSession:只有在增,删,改的时候需要提交事务,查询不要提交事务

getCurrentSession:所有操作必须放在事务中进行,并且提交事务后,session会自动关闭。

===》在同一个线程中的代码如下:

package com.demo.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class TestHibernate{
    public static void main(String[] args){
        SessionFactory sf=new Configuration().configure().buildSessionFactory();
        
        Session session1=sf.openSession();
        Session session2=sf.openSession();
        System.out.println(session1==session2);//flase
        session1.close();
        session2.close();
        Session session3=sf.getCurrentSession();
        Session session4=sf.getCurrentSession();
        System.out.println(session3==session4);//true
        sessjon3.close();
        //session4.close();只能关闭一次,不能再次进行关闭
        sf.close();
    }
}
View Code

===》在不同的线程中:

package com.demo.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class TestHibernate{
    public static void main(String[] args){
        SessionFactory sf=new Configuration().configure().buildSessionFactory();
        Session session1;
        Session session2;
        
        Thread thread1=new Thread(){
            public void run(){
                session1=sf.getCurrentSession();
            }
        };
        thread1.start();
        
        Thread thread2=new Thread(){
            public void run(){
                session2=sf.getCurrentSession();
            }
        };
        thread2.start();
        thread1.join();
        thread2.join();
        
        System.out.println(session1==session2);
    }
}
View Code

 

posted on 2018-03-06 17:21  Foreordination  阅读(153)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3