package cn.itcast.test;

import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import cn.itcast.utils.HibernateUtils;
import cn.itcast.vo.Customer;
import cn.itcast.vo.Order; /**
* Hibernate的抓取策略
* @author zhongzh
*
*/
public class HibernateDemo2 {
@Test
/*
*批量抓取 减少与数据库交互的次数
* 通过订单批量抓取客户:
* 需要在客户一端<class>标签上配置batch-size
* 批量抓取都是在一的一端配置的
*/
public void demo13(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
List<Order> list =session.createQuery("from Order").list();
for (Order order : list) {
System.out.println(order.getCustomer().getCname());
}
}
@Test
/*
*批量抓取 减少与数据库交互的次数
* 在客户的一端配置
* <set>集合上配置batch-size="3"
*/
public void demo12(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
List<Customer> list =session.createQuery("from Customer").list();
for (Customer customer : list) {
for (Order order : customer.getOrders()) {
System.out.println(order.getAddr());
}
}
}
@Test
/*
* 没有在<many-to-one>标签上配置:
* * fetch="select" lazy="proxy"
* * 发送多条SQL
*/
public void demo11(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 在这行发送多条SQL 查询关联对象.
Order order = (Order) session.get(Order.class, 1);
System.out.println(order.getCustomer().getCname());
tx.commit();
session.close();
}
@Test
/*
* 没有在<many-to-one>标签上配置:
* * fetch="select" lazy="false"
* * 发送多条SQL
*/
public void demo10(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 在这行发送多条SQL 查询关联对象.
Order order = (Order) session.get(Order.class, 1);
System.out.println(order.getCustomer().getCname());
tx.commit();
session.close();
} @Test
/*
* 没有在<many-to-one>标签上配置:
* * fetch="join" lazy="被忽略"
* * 发送迫切左外连接
*/
public void demo9(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//发送一条迫切左外连接.查询关联对象.
Order order = (Order) session.get(Order.class, 1);
System.out.println(order.getCustomer().getCname());
tx.commit();
session.close();
} @Test
/*
* 没有在<many-to-one>标签上配置:
* * 发送多条SQL进行查询.
*
*/
public void demo8(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//只会发送一条查询订单的SQL.
Order order = (Order) session.get(Order.class, 1); //使用订单的客户对象的时候,又发送一条SQL查询订单关联的客户
System.out.println(order.getCustomer().getCname());
tx.commit();
session.close();
} @Test
/*
* 在<set>集合上配置
* * fetch="subselect" lazy="true"
* * 使用subselect的时候 需要使用query接口进行测试.
* * 如果查询一个客户 查询多个客户.
* 如果有多个客户:
* * select * from orders where cno in (1,2,3);
* 如果只有一个客户:
* * select * from orders where cno = 1;
*/
public void demo7(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); List<Customer> list = session.createQuery("from Customer").list(); for (Customer customer : list) {
System.out.println(customer.getOrders().size());
} tx.commit();
session.close(); }
@Test
/*
* 在<set>集合上配置
* * fetch="select" lazy="extra"
* * lazy:extra:极其懒惰.要订单的数量
*/
public void demo6(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer = (Customer) session.get(Customer.class, 1);
// select count(*) from orders where cno = ?;
System.out.println(customer.getOrders().size());
//发送查询订单的SQL.
for (Order order : customer.getOrders()) {
System.out.println(order);//使用订单的是时候它才会发送查询订单的SQL.
} tx.commit();
session.close(); }
@Test
/*
* 在<set>集合上配置
* * fetch="select" lazy="false"
* * lazy:false:关联对象的检索不使用延迟
*/
public void demo5(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 发送多条SQL,查询关联对象.
Customer customer = (Customer) session.get(Customer.class, 1);
// 使用订单的时候又发送一条查询这个客户的订单的SQL
System.out.println(customer.getOrders().size()); tx.commit();
session.close(); }
@Test
/*
* 在<set>集合上配置
* * fetch="select" lazy="true"
* * lazy:true-使用延迟检索
* * 发送多条SQL,查询关联对象
*/
public void demo4(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 发送一条只查询客户的SQL
Customer customer = (Customer) session.get(Customer.class, 1);
// 使用订单的时候又发送一条查询这个客户的订单的SQL
System.out.println(customer.getOrders().size()); tx.commit();
session.close(); }
@Test
/*
*
* <set>配置fetch="join" lazy就会被忽略!!!!
* * 发送迫切左外连接查询两个表.
*/
public void demo3(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//直接发送一条迫切左外连接。其实迫切左外连接和左外连接的SQL语句是一样的.只不过封装的对象不一样.
//迫切左外连接封装到一个对象里.而普通左外连接封装到一个数组里.
//只要一查客户订单就出来了.
/*
* Hibernate:
select
customer0_.cid as cid0_1_,
customer0_.cname as cname0_1_,
orders1_.cno as cno0_3_,
orders1_.oid as oid3_,
orders1_.oid as oid1_0_,
orders1_.addr as addr1_0_,
orders1_.cno as cno1_0_
from
Customer customer0_
left outer join
orders orders1_
on customer0_.cid=orders1_.cno
where
customer0_.cid=? */
Customer customer = (Customer) session.get(Customer.class, 1); System.out.println(customer.getOrders().size()); tx.commit();
session.close(); } @Test
/*
*
* <set>没有配置fetch 和 lazy情况
*
*/
public void demo2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); Customer customer = (Customer) session.get(Customer.class,1);// 发送查询客户的SQL.
//System.out.println(customer.getCname()); System.out.println(customer.getOrders().size());// 使用了客户的订单的时候,才会发送查询订单的SQL. 又发送一条SQL 去查询客户的关联的订单.
tx.commit();
session.close();
} @Test
/*区分立即检索和延迟检索
*
*
*/
public void demo1(){ Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction(); //立即检索
//
/* Customer customer = (Customer) session.get(Customer.class, 1);
System.out.println(customer);*/
//延迟检索:
// 持久化类如果设置为final 延迟检索就失效了.因为不能生成代理对象
// 在Customer.hbm.xml中在<class>标签上配置lazy="false"不支持延迟检索,就会立即检索.
Customer customer = (Customer) session.load(Customer.class, 1);//这是类级别的检索
//System.out.println(customer);//如果这一行注释的话根本就不会发送SQL语句,你执行完了它也不会发送,因为你根本没有
//用到它里面的属性。
//初始化代理对象 发送SQL语句 产生代理对象 那肯定就能拿出来了
//System.out.println(customer.getCname()); //还可以这样来初始化代理对象
Hibernate.initialize(customer);//当你初始化的时候它才会发送SQL语句
tx.commit();
session.close(); } }
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.itcast.vo"><!-- 如果这里配置了包名下面可以不用写 -->
<!--
<hibernate-mapping>
-->
<!--
<class name="cn.itcast.hibernate3.demo2.Customer" table="customer">
-->
<!--
<class name="cn.itcast.vo.Customer" table="customer">
-->
<class name="Customer" batch-size="2" table="customer">
<!-- 配置唯一标识 -->
<id name="cid" column="cid">
<generator class="native"/>
</id>
<!-- 配置普通属性 -->
<property name="cname" column="cname" length="30"/> <!-- 建立映射 -->
<!-- 配置一个集合 <set>的name Customer对象中的关联对象的属性名称. -->
<!-- 这里把级联去掉 要最简短的配置
<set name="orders" cascade="save-update" inverse="true">
-->
<set name="orders" cascade="save-update" batch-size="2">
<!-- <key>标签中column:用来描述一对多多的一方的外键的名称. -->
<key column="cno"></key>
<!-- 配置一个<one-to-many>标签中class属性:订单的类的全路径 -->
<!--
<one-to-many class="cn.itcast.hibernate3.demo2.Order"/>
-->
<one-to-many class="cn.itcast.vo.Order"/>
</set>
</class>
<!-- 命名查询的方式 -->
<query name="findAll">
from Customer
</query>
<!-- 这里要写sql语句
<sql-query> </sql-query>
-->
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--
<class name="cn.itcast.hibernate3.demo2.Order" table="orders">
-->
<class name="cn.itcast.vo.Order" table="orders">
<!-- 配置唯一标识 -->
<id name="oid" column="oid">
<generator class="native"/>
</id>
<!-- 配置普通属性 -->
<property name="addr" column="addr" length="50"/>
<!-- 配置映射 -->
<!--
<many-to-one>标签
name :关联对象的属性的名称.
column :表中的外键名称.
class :关联对象类的全路径
-->
<!--
<many-to-one name="customer" column="cno" class="cn.itcast.hibernate3.demo2.Customer"/>
-->
<many-to-one name="customer" column="cno" class="cn.itcast.vo.Customer"/> </class>
</hibernate-mapping>
package cn.itcast.vo;

import java.util.HashSet;
import java.util.Set; /**
* 客户的实体:
* @author 姜涛
*
*/
public class Customer {
private Integer cid;
private String cname; public Customer() {//无参构造函数
super();
// TODO Auto-generated constructor stub
} public Customer(String cname) {//有参构造
super();
this.cname = cname;
} // 一个客户有多个订单.
private Set<Order> orders = new HashSet<Order>();
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
//@Override
/* public String toString() {//客户这里打印也打印出订单的集合。这是死循环了,所以这里应该去掉一方的打印。
return "Customer [cid=" + cid + ", cname=" + cname + ", orders="
+ orders + "]";
return "Customer [cid=" + cid + ", cname=" + cname + "]";//客户这里去掉订单集合的打印 }*/
//测试迫切内连接的封装效果。重写toString()方法
@Override
public String toString() {
return "Customer [cid=" + cid + ", cname=" + cname + ", orders="
+ orders + "]";
}
}
package cn.itcast.vo;
/**
* 订单的实体:
* @author 姜涛
*
*/
public class Order {
private Integer oid;
private String addr;
// 订单属于某一个客户.放置一个客户的对象.
private Customer customer;
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
//@Override
/* public String toString() {//订单这边又打印客户了。这是死循环了,所以这里应该去掉一方的打印。
return "Order [oid=" + oid + ", addr=" + addr + ", customer="
+ customer + "]";
}*/
//测试迫切内连接的封装效果。重写toString()方法
@Override
public String toString() {//两边不能同时打印,不然容易出问题
return "Order [oid=" + oid + ", addr=" + addr + "]";
} }

day36 08-Hibernate抓取策略:批量抓取的更多相关文章

  1. Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取

    1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // ...

  2. Hibernate 抓取策略fetch-1 (select join subselect)

    原文 :http://4045060.blog.51cto.com/4035060/1088025 部分参考:http://www.cnblogs.com/rongxh7/archive/2010/0 ...

  3. Hibernate 原汁原味的四种抓取策略(转)

    原文出处:http://www.cnblogs.com/rongxh7/archive/2010/05/12/1733088.html     尊重原作者,访问原创地址 最近在研究 Hibernate ...

  4. 八 Hibernate延迟加载&抓取策略(优化)

    面试:Hibernate效率很低,如何优化? 缓存怎么弄的,语句怎么优化? 聊聊一级缓存,聊聊抓取策略和延迟加载,聊聊批量抓取 延迟加载: 一般不单独使用,和延迟加载一起使用 延迟加载:lazy(懒加 ...

  5. Hibernate(十四)抓取策略

    抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...

  6. Hibernate学习笔记(八) — 懒载入与抓取策略

    懒载入(Load On Demand)是一种独特而又强大的数据获取方法,它可以在用户滚动页面的时候自己主动获取很多其它的数据,而新得到的数据不会影响原有数据的显示,同一时候最大程度上降低server端 ...

  7. java之hibernate之加载策略和抓取策略

    1.加载策略:指hibernate查询数据时,采用什么样的方式将数据写入内存.Hibernate中提供了两种方式来加载数据:懒加载和即时加载. 2.懒加载又称延迟加载,指使用hiberante API ...

  8. Hibernate 抓取策略fetch-2 (批量抓取batch-size以及hibernate.jdbc.fetch_size、hibernate.jdbc.batch_size)

    类关系: User N~1 Group 测试代码: System.out.println("1"); List stuList = session.createQuery(&quo ...

  9. Hibernate之抓取策略

    时间:2017-1-23 19:08 --区分延迟和立即检索1.立即检索    当执行某行代码时,会马上发出SQL语句进行查询.    例如:get()2.延迟检索    当执行某行代码时,不会马上发 ...

随机推荐

  1. g2o学习资料

    g2o下载:https://github.com/RainerKuemmerle/g2o/tree/9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a g2o的基本框架结 ...

  2. Spring中的Junit

    Spring中的Junit package com.imooc.test.base; import org.junit.After; import org.junit.Before; import o ...

  3. 06_springmvc之参数绑定(pojo和集合)

    一.包装类型pojo参数绑定 实现方法: 第一种方法:在形参中 添加HttpServletRequest request参数,通过request接收查询条件参数. 第二种方法:在形参中让包装类型的po ...

  4. 短URL系统、301/302重定向

    短 URL 系统是怎么设计的?https://yq.aliyun.com/articles/87600 短网址(short URL)系统的原理及其实现 https://hufangyun.com/20 ...

  5. Windows 系统文件夹目录挂载到 Linux服务器中

    在Windows系统文件上传到Linux服务器时有时候很麻烦,因为Linux无界面的系统不像Windows系统一样,可以直接复制粘贴,下面方法可以解决Windows系统文件拷贝到Linux服务器. 1 ...

  6. hadoop2.x 完全分布式详细集群搭建(图文:4台机器)

    在准备之前说一下本次搭建的各节点角色,进程. nameNode 进程:NameNode dataNode  进程:DataNode resourceManager :ResourceManager n ...

  7. sql 递归查询,查出所有子节点

    with t as ( select b.* from Base_Department b where ParentId = 'cce4152c-3483-4334-b68d-155da627bca0 ...

  8. HBase Region的定位

  9. mysql出错的代码解析及解答

    1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目 ...

  10. CodeForces - 752B

    CodeForces - 752Bhttps://vjudge.net/problem/597648/origin简单模拟,主要是细节特殊情况多考虑一下,看代码就行 #include<iostr ...