• 04_Hibernate检索方式


    一.Hibernate检索方式概述

    1. OID检索方式:按照对象的OID来检索对象(get/load)
    2. HQL检索方式:使用面向对象的HQL查询语言
    3. QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种api封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口(功能较弱)
    4. 本地SQL检索方式:使用本地数据库的SQL查询语句。

    二.Hibernate检索策略

    Hibernate提供了多种查询检索方式,每种方式查询数据的方式与时间段都不同,

    Hibernate提供了延迟加载(load)、立即加载(get)两种检索策略。

    延迟加载(懒加载):延迟加载检索方法指定的对象,也就是查询的时候并不是马上去查询并加载持久化对象,而是在调用持久化对象的方法时再去加载。

    立即加载:立即加载检索方法指定的对象。

    ->使用load方法获取对象,默认是延迟加载的,通过观察sql语句执行的位置可以看出,检索持久化对象时并不查询数据库,而当调用持久化对象的方法时才去查询数据库,这种策略就叫延迟加载。使用get方法获取持久化对象,会马上执行sql语句,这种策略叫立即加载。

    public class Demo {
        @Test
        public void test(){
          Configuration cfg = new Configuration().configure();
            SessionFactory sf = cfg.buildSessionFactory();
            Session session = sf.openSession();
            Transaction ts = session.beginTransaction();
    
            Dept dept = (Dept)session.load(Dept.class, 1);
            System.out.println("此时不查询数据库");
            System.out.println(dept.getDname());
    
            ts.commit();
            session.close();
            sf.close();
        }
        
    }

    使用load方法时,返回的是一个代理对象,该代理对象的特点:

    1 .是持久化类的子类对象。

    2 .包含持久化类的全部属性以及属性的get/set函数。

    3. 对get函数进行了覆盖:原理如下

               public String getName() {

                          this.name = queryFromDb();//数据库查询

                          return this.name;

      }

     4.Hibernate使用javassist-3.9.0.GA.jar包创建代理

    类级别检索策略: session的方法直接检索持久化对象,hibernate加载该持久化对象的策略。

    关联级别检索策略:查询持久化对象的关联对象的加载策略。

    三.关联级别检索策略(一对多,多对多检索策略)

    lazy属性:是否延迟加载,

                    true :延迟加载  (默认):查询持久化对象,使用相关联对象时再去查询

                    false:即时加载  :查询持久化对象时会查询出所有与持久化对象相关联的对象

    一般情况下都要设置Lazy=true, 这样可以少查无用的数据, 提高性能. 但是有的时候需要一次性把关联的数据都查出来, 这个时候就需要使用积极加载去避免lazy loading了. 具体情况具体分析。

    * 类级别的检索:<class>标签上配置lazy

    * 关联级别的检索: <set>/<many-to-one>上面的lazy。

    注意:无论 <class> 元素的 lazy 属性是 true 还是 false, Session get() 方法在类级别总是使用立即检索策略

    比较检索策略

    四.HQL检索方式

    1>HQL(Hibernate Query Language) 是面向对象的查询语言,确切的说他是以脚本的方式查询对象的语言。 它和SQL查询语言有些相似. 在Hibernate提供的各种检索方式中, HQ是使用最广的一种检索方式. 它有如下功能:

    2>在查询语句中设定各种查询条件

                支持投影查询,即仅检索出对象的部分属性;

                支持分页查询;

                支持连接查询;

                支持分组查询,允许使用having和group by关键字

                提供内置聚集函数,如sum(),min(),max();

                能够调用用户定义的SQL函数或标准的SQL函数;

                支持子查询;

                支持动态绑定参数;

    /**
     * Created by jiatp 
     */
    public class HqlTest {
        //1.基本查询
        @Test
        public void test1(){
            Session session = HibernateUtils.openSession();
            Transaction ts = session.beginTransaction();
            //查询所有部门信息
            String hql = "from Dept";
            Query query = session.createQuery(hql);
            List<Dept> list = query.list();
            for(Dept dept:list) {
                System.out.println(dept.getDname());
                System.out.println(dept.getEmps().size());
            }
            ts.commit();
            session.close();
    
        }
        //2.条件查询  1.占位符 2.参数命名
        @Test
        public void test2(){
            Session session = HibernateUtils.openSession();
            Transaction ts = session.beginTransaction();
            //查询所有部门信息
            String hql1 = "from Dept where did=?";
            String hql2 = "from Dept where did=:did";
            Query query1 = session.createQuery(hql1);
            Query query2 = session.createQuery(hql2);
            //占位符赋值
            query1.setInteger(0,1);
            //参数命名赋值
            query2.setInteger("did",1);
            //查询
            Dept dept1 = (Dept)query1.uniqueResult();
            Dept dept2 = (Dept)query2.uniqueResult();
            System.out.println(dept1.getDname());
            System.out.println(dept2.getDname());
            ts.commit();
            session.close();
    
        }
        //3.分页查询
        @Test
        public void test3(){
            Session session = HibernateUtils.openSession();
            Transaction ts = session.beginTransaction();
            //查询所有部门信息
            String hql = "from Dept where dname like ?";
            Query query = session.createQuery(hql);
            query.setParameter(0,"%发%"); //变量用+连接"+"+ 变量+"%"
            //分页
            query.setFirstResult(0);
            query.setMaxResults(3);
            List<Dept> list = query.list();
            for(Dept dept: list) {
                System.out.println(dept.getDid()+"==="+dept.getDname());
            }
            ts.commit();
            session.close();
    
    
        }
        //4.投影查询 返回一个数组
        @Test
        public void test5(){
            Session session = HibernateUtils.openSession();
            Transaction ts = session.beginTransaction();
            //查询所有部门信息
            String hql1 = "select did,dname from Dept";//返回对象数组
            Query query = session.createQuery(hql1);
            List<Object[]> list = query.list();
            for(int i=0;i<list.size();i++) {
                Object[] object = list.get(i);
                System.out.println(object[0]+"===="+object[1]);
            }
            String hql2 = "select dt from Dept dt"; //返回集合对象
            Query query1 = session.createQuery(hql2);
            List<Dept> list1 = query1.list();
            for(Dept dept:list1) {
                System.out.println(dept.getDid()+"=="+dept.getDname());
            }
    
            //Dept类中要提供构造方法
            String hql3 = "select new Dept(did,dname) from Dept";
            Query query2 = session.createQuery(hql3);
            List<Dept> list2 = query2.list();
           for(Dept dept:list2) {
                System.out.println(dept.getDid()+"=="+dept.getDname());
            }
            ts.commit();
            session.close();
        }
        // 5.排序
        @Test
        public void test6(){
            Session session = HibernateUtils.openSession();
            Transaction ts = session.beginTransaction();
            String hql = "select dt from Dept d t order by dt.did desc";
            Query query = session.createQuery(hql);
            List<Dept> list = query.list();
            for(Dept dept:list) {
                System.out.println(dept.getDid()+"=="+dept.getDname());
            }
            ts.commit();
            session.close();
        }
        //6.查询聚合函数
        @Test
        public void test7(){
            Session session = HibernateUtils.openSession();
            Transaction ts = session.beginTransaction();
            String hql1 = "select COUNT (*) FROM Dept";
            String hql2 = "select sum (did) FROM Dept";
            String hql3 = "select avg (did) FROM Dept";
            String hql4 = "select max (did) FROM Dept";
            String hql5 = "select min (dit) FROM Dept";
            Query query = session.createQuery(hql1);
            Number i =(Number) query.uniqueResult();
            System.out.println(i);
            ts.commit();
            session.close();
        }
        //7.增加一个部门 广告部
        @Test
        public void test8(){
            Session session = HibernateUtils.openSession();
            Transaction ts = session.beginTransaction();
           Dept dept = new Dept();
           dept.setDname("广告部");
           session.save(dept);
            ts.commit();
            session.close();
    
        }
    
        //8.删除
        @Test
        public void test9(){
            Session session = HibernateUtils.openSession();
            Transaction ts = session.beginTransaction();
            String hql = "delete from Dept dt where dt.did=? ";
            Query query = session.createQuery(hql);
            query.setParameter(0,7);
            query.executeUpdate();
            ts.commit();
            session.close();
    
        }
        //外联(左外联,右外联)/迫切
        //内联,           
        @Test
        public void test8() {
            Session session = HibernateUtils.openSession();
            Transaction tx = session.beginTransaction();
            //************************************
            String hql="from Dept d inner join d.emps";
            Query query = session.createQuery(hql);
            List list = query.list();
            for(int i=0;i<list.size();i++){
                Object[] obj = (Object[]) list.get(i);
                System.out.println(((Dept)obj[0]).getDname()+"===="+((Emp)obj[1]).getEname());
            }
            //************************************
            tx.commit();
            session.close();
        }
        //内联,/迫切
        @Test
        public void test9() {
            Session session = HibernateUtils.openSession();
            Transaction tx = session.beginTransaction();
            //*****************************************
            String hql="from Dept d inner join fetch d.emps";
            Query query = session.createQuery(hql);
            List<Dept> list = query.list();
            //创建集合保存部门名称 
            List<String> lstr = new ArrayList<String>();
            for (Dept dept : list) {
                Set<Emp> emps = dept.getEmps();
                Iterator<Emp> it = emps.iterator();
                while(it.hasNext()){
                    Emp emp = it.next();
                    if(lstr.contains(emp.getDept().getDname())){
                        continue;
                    }else{
                        System.out.println(dept.getDname()+"==="+emp.getEname());
                    }
                }
                //处理重复部门名
                lstr.add(dept.getDname());
            }
            //****************************************
            tx.commit();
            session.close();
        }
        //左外联
        @Test
        public void test10() {
            Session session = HibernateUtils.openSession();
            Transaction tx = session.beginTransaction();
            //************************************
            String hql="from  Dept d left join d.emps";
            Query query = session.createQuery(hql);
            List list = query.list();
            for(int i=0;i<list.size();i++){
                Object[] obj = (Object[]) list.get(i);
                if(obj!=null){
                    System.out.print(((Dept)obj[0]).getDname());
                    if(((Emp)obj[1])!=null){
                        System.out.print("	"+((Emp)obj[1]).getEname());
                    }
                    System.out.println();
                }
            }
    
            //************************************
            tx.commit();
            session.close();
        }
        //右外联,
        @Test
        public void test11() {
            Session session = HibernateUtils.openSession();
            Transaction tx = session.beginTransaction();
            //************************************
            String hql="from Dept d right join d.emps";
            Query query = session.createQuery(hql);
            List list = query.list();
            for(int i=0;i<list.size();i++){
                Object[] obj = (Object[]) list.get(i);
                if(obj!=null){
                    if(((Dept)obj[0])!=null){
                        System.out.print(((Dept)obj[0]).getDname());
                    }
                    if(((Emp)obj[1])!=null){
                        System.out.print("	"+((Emp)obj[1]).getEname());
                    }
                    System.out.println();
                }
            }
    
            //************************************
            tx.commit();
            session.close();
        }
        //左外联,/迫切
        @Test
        public void test12() {
            Session session = HibernateUtils.openSession();
            Transaction tx = session.beginTransaction();
            //************************************
            String hql="from Dept d left join fetch d.emps";
            Query query = session.createQuery(hql);
            List<Dept> list = query.list();
            for(Dept dept : list){
                Set<Emp> emps = dept.getEmps();
                Iterator<Emp> it = emps.iterator();
                //
                if(dept.getDname()!=null){
                    System.out.print(dept.getDname());
                }
                while(it.hasNext()){
                    Emp emp = it.next();
                    if(emp.getDept().getDname()!=dept.getDname()){
                        System.out.print(dept.getDname());
                    }
                    if(emp.getEname()!=null){
                        System.out.print("	"+emp.getEname());
                    }
                    System.out.println();
                }
            }
    
            //************************************
            tx.commit();
            session.close();
        }
        //分组
        @Test
        public void test13(){
            Session session = HibernateUtils.openSession();
            Transaction tx = session.beginTransaction();
            //************************************
            //查询部门中的员工的人数
            String hql ="select count(*),e.dept.dname from Emp e group by e.dept.dname";
            Query query = session.createQuery(hql);
            List<Object[]> list = query.list();
            for(int i = 0 ;i<list.size();i++){
                Object[] o =  list.get(i);
                System.out.println(o[0]+"====="+o[1]);
            }
            //************************************
            tx.commit();
            session.close();
        }
    }
    

    五.QBC检索方式

                 QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。

    public class TestQbc {
    
    	//简单的查询  (无sql)
    	@Test
    	public void test() {
    		Session session = HibernateUtils.openSession();
    		Transaction tx = session.beginTransaction();
    		//************************************
    		//查询所有部门信息
    		Criteria criteria = session.createCriteria(Dept.class);
    		List<Dept> list = criteria.list();
    		System.out.println(list);
    		//************************************
    		tx.commit();
    		session.close();
    	}
    	//按条件查询
    	//==        	eq
    	//>=			ge
    	//>				gt
    	//<=			le
    	//<				lt
    	//<> !=			ne
    	//in			in
    	//between 		between
    	//like 			like 
    	//is null		isNull
    	//is not null	isNotNull
    	//and 			and 
    	//or			or
    	@Test
    	public void test1() {
    		Session session = HibernateUtils.openSession();
    		Transaction tx = session.beginTransaction();
    		//************************************
    		//查询did=2 部门名称
    		Criteria criteria = session.createCriteria(Dept.class);
    		criteria.add(Restrictions.eq("did", 2));
    		Dept dept = (Dept) criteria.uniqueResult();
    		
    		System.out.println(dept.getDname());
    		//************************************
    		tx.commit();
    		session.close();
    	}
    	//分页
    	@Test
    	public void test2() {
    		Session session = HibernateUtils.openSession();
    		Transaction tx = session.beginTransaction();
    		//************************************
    		//limit 0,3
    		Criteria criteria = session.createCriteria(Dept.class);//.setFirstResult(0).setMaxResults(3).list();
    		criteria.setFirstResult(0);  //起始值 
    		criteria.setMaxResults(3);    //条数
    		List<Dept> list = criteria.list();
    		System.out.println(list);
    		//************************************
    		tx.commit();
    		session.close();
    	}
    	//查询总记录数
    	@Test
    	public void test3() {
    		Session session = HibernateUtils.openSession();
    		Transaction tx = session.beginTransaction();
    		//************************************
    		//limit 0,3
    		Criteria criteria = session.createCriteria(Dept.class);
    		criteria.setProjection(Projections.rowCount());
    		Long iter = (Long) criteria.uniqueResult();
    		System.out.println(iter);
    		//************************************
    		tx.commit();
    		session.close();
    	}
    	
    }
    

       Criteria:限制符

    六.本地SQL检索方式

    public class TestSql {
    
    	//简单部门信息
    	@Test
    	public void test1() {
    		Session session = HibernateUtils.openSession();
    		Transaction tx = session.beginTransaction();
    		//************************************
    		String sql="select dname,ename from Dept d,emp e where d.did=e.deptid";
    		SQLQuery sqlquery = session.createSQLQuery(sql);
    		List list = sqlquery.list();
    		for(int i=0;i<list.size();i++){
    			Object[] obj = (Object[]) list.get(i);
    			System.out.println(obj[0]+"===="+obj[1]);
    		}
    		//************************************
    		tx.commit();
    		session.close();
    	}
    	//条件
    	@Test
    	public void test2() {
    		Session session = HibernateUtils.openSession();
    		Transaction tx = session.beginTransaction();
    		//************************************
    		String sql="select * from Dept where dname like ?";
    		SQLQuery sqlquery = session.createSQLQuery(sql);
    		sqlquery.setParameter(0, "%发%");
    		//返回实体
    		sqlquery.addEntity(Dept.class);
    		List<Dept> list = sqlquery.list();
    		for (Dept dept : list) {
    			System.out.println(dept.getDname());
    		}
    		//************************************
    		tx.commit();
    		session.close();
    	}
    	//分页
    	@Test
    	public void test3() {
    		Session session = HibernateUtils.openSession();
    		Transaction tx = session.beginTransaction();
    		//************************************
    		String sql="select * from Dept limit ?,?";   //hql语句:count(*)
    		SQLQuery sqlQuery = session.createSQLQuery(sql);
    		sqlQuery.setParameter(0, 0);
    		sqlQuery.setParameter(1, 2);
    		sqlQuery.addEntity(Dept.class);
    		List<Dept> list = sqlQuery.list();
    		for(Dept dept : list){
    			System.out.println(dept.getDname());
    		}
    		//************************************
    		tx.commit();
    		session.close();
    	}
    }

    HQL和QBC比较:

  • 相关阅读:
    火狐获取图片宽和高的方法
    JDBC连接本地sqlserver2005的方法
    war文件不在tomcat 的webapps运行
    javascript 去除空格 方法
    火狐显示图片的方法
    八款开源Android游戏引擎
    android 模拟器 hardWare 属性说明
    jqgrid 属性说明
    Java命名规范
    在MyEclipse里怎样一次性取消所有断点
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767537.html
Copyright © 2020-2023  润新知