• 五、持久层框架(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()+"	");
            }
            
            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
  • 相关阅读:
    vue、vuex、iview、vue-router报错集锦与爬坑记录
    iview框架select默认选择一个option的值
    datetimerangepicker配置及默认时间段展示
    windows下nvm安装node之后npm命令找不到问题解决办法
    The difference between the request time and the current time is too large.阿里云oss上传图片报错
    html5 移动适配写法
    JS判断设备类型跳转至PC端或移动端相应页面
    vue2.0生命周期好文章推荐
    vue如何正确销毁当前组件的scroll事件?
    Apache Shiro 反序列化RCE漏洞
  • 原文地址:https://www.cnblogs.com/drq1/p/8515537.html
Copyright © 2020-2023  润新知