Hibernate_Day04

我是研究僧i 提交于 2019-12-12 09:08:19

Hibernate_Day04

1. hibernate的检索方式

  • Hibernate提供了很多种查询方式:hibernate共提供了五种查询方式

1.1 Hibernate的查询方式:OID查询

1.2 Hibernate的查询方式:对象导航检索

1.3 Hibernate的查询方式:HQL检索

  • 不支持*写法

1.3.1准备工作:创建数据

@Test
	public void demi01(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		
		Customer customer = new Customer();
		
		customer.setCust_name("张渣");
		
		for (int i = 0; i < 10; i++) {
			LinkMan linkMan = new LinkMan();
			
			linkMan.setLkm_name("野结衣"+i);
			
			linkMan.setCustomer(customer);
			
			customer.getLinkMan().add(linkMan);
			
			session.save(linkMan);
			
		}
		
		session.save(customer);
		
		transaction.commit();
	}

1.3.2:HQL简单查询

	@Test
	/**
	 * 简单查询
	 */
	public void demi02(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		
		List<Customer> list = session.createQuery("from Customer").list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		transaction.commit();
	}

1.3.3:HQL排序查询

@Test
	/**
	 * 排序查询
	 */
	public void demi03(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		
		
		//默认升序排列
		//List<Customer> list = session.createQuery("from Customer order by cust_id").list();
		//降序排列
		List<Customer> list = session.createQuery("from Customer order by cust_id desc").list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		transaction.commit();
	}

1.3.4:HQL条件查询

@Test
	/**
	 * 条件查询
	 */
	public void demi04(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		
		/**
		 * 条件查询有两种方式
		 * 一、按照参数位置
		 * 二、按照名称绑定
		 */
		
		//一、按照参数位置
		
	/*	Query query = session.createQuery("from Customer where cust_name=? and cust_source=?");
		
		query.setParameter(0, "张渣");
		query.setParameter(1, "小广告");
		
		List<Customer> list = query.list();
		*/
		
		
		//二、按照名称绑定
		
		//注意		冒号和别名之间不能有空格
		
		Query query = session.createQuery("from Customer where cust_name=:aaa and cust_source=:bbb");
		
		query.setParameter("aaa", "张渣");
		query.setParameter("bbb", "小广告");
		
		List<Customer> list = query.list();
		
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		transaction.commit();
	}

1.3.5:HQL投影查询

	@Test
	/**
	 * 投影查询
	 */
	public void demi05(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		
	/*	//单个属性 :返回一个object
		List<Object> list = session.createQuery("select c.cust_name from Customer c").list();
		for (Object object : list) {
			System.out.println(object);
		}*/
		
		/*//多个属性:返回一个object数组
		
		List<Object[]> list = session.createQuery("select c.cust_name,c.cust_source from Customer c").list();
		
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}*/
		
		/*
		 * 查询多个属性,想要将其封装到相应的对象中
		 * 	1.在类中提供一个无参的构造方法(反射使用)
		 * 	2.创建一个有参的构造方法(参数是想要显示的属性)
		 */
		
		List<Customer> list = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		
		transaction.commit();
	}

1.3.6:HQL分组统计查询

@Test
	/**
	 * 分组统计查询
	 */
	public void demi07(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		
		/*//uniqueResult();返回一个结果,为Long类型
		Object result = session.createQuery("select count(*) from Customer").uniqueResult();
		
		System.out.println(result);*/
		
		
	/*	//uniqueResult();返回一个结果,为Long类型
		List<Object[]> list = session.createQuery("select cust_source,count(*) from Customer group by cust_source").list();
		
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}*/
		
		//uniqueResult();返回一个结果,为Long类型
		//分组统计过滤
		List<Object[]> list = session.createQuery("select cust_source,count(*) from Customer group by cust_source having count(*) >=2").list();
		
		for (Object[] objects : list) {
			System.out.println(Arrays.toString(objects));
		}
		
		transaction.commit();
	}

1.3.7:HQL分页查询

@Test
	/**
	 * 分页查询
	 */
	public void demi06(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		
		Query query = session.createQuery("from LinkMan");
		
		//从第几条记录开始查
		query.setFirstResult(10);
		//查多少条记录
		query.setMaxResults(10);
		
		List<LinkMan> list = query.list();
		
		for (LinkMan linkMan : list) {
			System.out.println(linkMan);
			
		}
		
		transaction.commit();
	}

1.3.8:HQL别名查询

@Test
	/**
	 * 别名查询
	 */
	public void demi08(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		//别名查询
		List<Customer> list = session.createQuery("select c from Customer c").list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		transaction.commit();
	}

1.4 Hibernate的查询方式:QBC检索

1.4.1:简单查询

@Test
	/**
	 * 简单查询
	 */
	public void demi09(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		
		//获得Criteria对象
		Criteria criteria = session.createCriteria(Customer.class);
		List<Customer> list = criteria.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		transaction.commit();
	}

1.4.2:排序查询

@Test
	/**
	 * 排序查询
	 */
	public void demi10(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		//获得Criteria对象
		Criteria criteria = session.createCriteria(Customer.class);
		//addOrder排序		Order.desc升序还是降序		按照cust_id排序
		criteria.addOrder(Order.desc("cust_id"));
		List<Customer> list = criteria.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		transaction.commit();
	}

1.4.3:分页查询

	@Test
	/**
	 * 分页查询
	 */
	public void dem11(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		//获得Criteria对象
		Criteria criteria = session.createCriteria(LinkMan.class);
		
		//分页开始的下标
		criteria.setFirstResult(0);
		//每一页显示的数据
		criteria.setMaxResults(10);
		
		List<LinkMan> list = criteria.list();
		
		for (LinkMan linkMan : list) {
			System.out.println(linkMan);
		}
		
		transaction.commit();
	}
	

1.4.4:条件查询

	@Test
	/**
	 * 条件查询
	 */
	public void demo12(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		//获得Criteria对象
		Criteria criteria = session.createCriteria(Customer.class);
		/**
		 * 设置条件
		 * = 	eq
		 * > 	gt
		 * >=	ge
		 * <	lt
		 * <=	le
		 * <>	ne
		 * like
		 * in
		 * or
		 * and
		 */
		//								字段名	等于	xxx
		criteria.add(Restrictions.eq("cust_source", "小广告"));
		criteria.add(Restrictions.like("cust_name", "段%"));
		
		List<Customer> list = criteria.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		
		transaction.commit();
	}
	

1.4.5:统计查询

@Test
	/**
	 * 统计查询
	 */
	public void demo13(){
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		//获得Criteria对象
		Criteria criteria = session.createCriteria(Customer.class);
		/**
		 * 设置条件
		 * add				:普通条件,where后面的条件
		 * addOrder			:排序
		 * setProjection	:聚合函数  和   group by having
		 */
		/**
		 * Projections里面的参数
		 * 		* .rowCount():统计个数,类似于count(*)
		 * 		* .avg(propertyName):计算平均成绩,括号里面写字段名
		 * 		* .count(propertyName):统计个数,按照字段统计
		 * 		* .groupProperty(propertyName):按照字段分组
		 * 		* .max(propertyName):最大值
		 * 		* .min(propertyName):最小值
		 */
		criteria.setProjection(Projections.rowCount());
		Long num = (Long) criteria.uniqueResult();		
		
		System.out.println(num);
		
		transaction.commit();
	}

1.4.6:离线条件查询SSH)—DetachedCriteria

	@Test
	/**
	 * 离线条件查询
	 */
	public void demo14(){
		//获得离线条件查询对象
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
		//添加条件
		detachedCriteria.add(Restrictions.like("cust_name", "段%"));
		
		Session session = HibernateUtils.getCurrentSession();
		
		Transaction transaction = session.beginTransaction();
		//获得Criteria对象
		Criteria criteria = detachedCriteria.getExecutableCriteria(session);
		
		List<Customer> list = criteria.list();
		
		for (Customer customer : list) {
			System.out.println(customer);
		}
		transaction.commit();
	}

1.5 Hibernate的查询方式:SQL检索

2. hibernate的抓取策略

2.1 Hibernate的抓取策略(优化)

2.1.1延迟加载的概述

延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。

2.1.2延迟加载的分类

  • 类级别的延迟加载
    • 指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);
    • 类级别延迟加载通过上的lazy进行配置,如果让lazy失效
      • 将lazy设置为false
      • 将持久化类使用final修饰
      • Hibernate. Initialize()
  • 关联级别的延迟加载
    • 指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。
      Customer customer = session.get(Customer.class,1l);
      customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。
  • 抓取策略往往会和关联级别的延迟加载一起使用,优化语句。

2.1.3抓取策略

  • 抓取策略的概述

      1. 通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。
      2. 通过<set>或者<many-to-one>上通过fetch属性进行设置
      3. fetch和这些标签上的lazy如何设置优化发送的SQL语句
    
  • <set>上的fetch和lazy

  1. fetch:抓取策略,控制SQL语句格式

     1. select		:默认值,发送普通的select语句,查询关联对象
     2. join			:发送一条迫切左外连接查询关联对象
     3. subselect		:发送一条子查询查询其关联对象
    
  2. lazy:延迟加载,控制查询关联对象的时候是否采用延迟

    1. true			:默认值,查询关联对象的时候,采用延迟加载
    2. false			:查询关联对象的时候,不采用延迟加载
    3. extra		:及其懒惰。
    
  • 在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join。
  • <many-to-one>上的fetch和lazy
  1. fetch :抓取策略,控制SQL语句格式。

     1. select	:默认值,发送普通的select语句,查询关联对象。
     2. join:发送一条迫切左外连接。
    
  2. lazy :延迟加载,控制查询关联对象的时候是否采用延迟。

     1. proxy	:默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。
     2. false:查询关联对象,不采用延迟。
     3.	no-proxy	:(不会使用)
     4. 在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join。
    

2.1.4批量抓取

  • 什么是批量抓取

一批关联对象一起抓取,batch-size

  • 测试批量抓取
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!