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. eigen矩阵操作练习

    // // Created by qian on 19-7-16. // /* 相机位姿用四元数表示 q = [0.35, 0.2, 0.3, 0.1] x,y,z,w * 注意:输入时Quatern ...

  2. vue的无缝滚动插件vue-seamless-scroll的使用

    https://chenxuan0000.github.io/component-document/index_prod.html#/component/seamless-others 在vue环境下 ...

  3. 简单科普下hosts文件原理与制作

    简单科普下hosts文件原理与制作 hosts文件是一个用于储存计算机网络中各节点信息的计算机文件.这个文件负责将主机名映射到相应的IP地址.hosts文件通常用于补充或取代网络中DNS的功能.和DN ...

  4. 在线Online表单来了!JeecgBoot 2.1 版本发布——基于SpringBoot+AntDesign的快速开发平台

    项目介绍 Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台! 采用前后端分离架构:SpringBoot,Ant-Design-Vue,Mybatis,Shiro,JWT. ...

  5. SpringCloud学习笔记(三):Rest微服务构建案例工程模块

    需要具备的知识 1 springmvc+mybatis+mysql 2 Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务 3 Maven的分包分模 ...

  6. 【CF285E】Positions in Permutations

    题目 刷水题涨信心 显然这是个广义容斥,我们现在算一下至少有\(i\)个完美数的方案数就好了 这\(1000\)的数据范围显然在暗示\(n^2\)的dp 我们注意到这个条件大概就是\(P_i=i-1\ ...

  7. 07-img和a标签

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Chsh- Linux必学的60个命令

    1.作用 chsh命令的作用是更改使用者shell设定,它的使用权限是所有使用者. 2.格式 chsh [ -s ] [ -list] [ --help ] [ -v ] [ username ] 3 ...

  9. webpack打包css文件

    1. 安装css-loader 与 style-loader npm install style-loader css-loader --save-dev 2. 在webpack.config.js中 ...

  10. TF-IDF了解

    http://en.wikipedia.org/wiki/Tf%E2%80%93idf