1. package cn.itcast.test;
  2.  
  3. import java.util.List;
  4.  
  5. import org.hibernate.Hibernate;
  6. import org.hibernate.Session;
  7. import org.hibernate.Transaction;
  8. import org.junit.Test;
  9.  
  10. import cn.itcast.utils.HibernateUtils;
  11. import cn.itcast.vo.Customer;
  12. import cn.itcast.vo.Order;
  13.  
  14. /**
  15. * Hibernate的抓取策略
  16. * @author zhongzh
  17. *
  18. */
  19. public class HibernateDemo2 {
  20. @Test
  21. /*
  22. *批量抓取 减少与数据库交互的次数
  23. * 通过订单批量抓取客户:
  24. * 需要在客户一端<class>标签上配置batch-size
  25. * 批量抓取都是在一的一端配置的
  26. */
  27. public void demo13(){
  28. Session session = HibernateUtils.openSession();
  29. Transaction tx = session.beginTransaction();
  30. List<Order> list =session.createQuery("from Order").list();
  31. for (Order order : list) {
  32. System.out.println(order.getCustomer().getCname());
  33. }
  34. }
  35. @Test
  36. /*
  37. *批量抓取 减少与数据库交互的次数
  38. * 在客户的一端配置
  39. * <set>集合上配置batch-size="3"
  40. */
  41. public void demo12(){
  42. Session session = HibernateUtils.openSession();
  43. Transaction tx = session.beginTransaction();
  44. List<Customer> list =session.createQuery("from Customer").list();
  45. for (Customer customer : list) {
  46. for (Order order : customer.getOrders()) {
  47. System.out.println(order.getAddr());
  48. }
  49. }
  50. }
  51. @Test
  52. /*
  53. * 没有在<many-to-one>标签上配置:
  54. * * fetch="select" lazy="proxy"
  55. * * 发送多条SQL
  56. */
  57. public void demo11(){
  58. Session session = HibernateUtils.openSession();
  59. Transaction tx = session.beginTransaction();
  60. // 在这行发送多条SQL 查询关联对象.
  61. Order order = (Order) session.get(Order.class, 1);
  62. System.out.println(order.getCustomer().getCname());
  63. tx.commit();
  64. session.close();
  65. }
  66. @Test
  67. /*
  68. * 没有在<many-to-one>标签上配置:
  69. * * fetch="select" lazy="false"
  70. * * 发送多条SQL
  71. */
  72. public void demo10(){
  73. Session session = HibernateUtils.openSession();
  74. Transaction tx = session.beginTransaction();
  75. // 在这行发送多条SQL 查询关联对象.
  76. Order order = (Order) session.get(Order.class, 1);
  77. System.out.println(order.getCustomer().getCname());
  78. tx.commit();
  79. session.close();
  80. }
  81.  
  82. @Test
  83. /*
  84. * 没有在<many-to-one>标签上配置:
  85. * * fetch="join" lazy="被忽略"
  86. * * 发送迫切左外连接
  87. */
  88. public void demo9(){
  89. Session session = HibernateUtils.openSession();
  90. Transaction tx = session.beginTransaction();
  91. //发送一条迫切左外连接.查询关联对象.
  92. Order order = (Order) session.get(Order.class, 1);
  93. System.out.println(order.getCustomer().getCname());
  94. tx.commit();
  95. session.close();
  96. }
  97.  
  98. @Test
  99. /*
  100. * 没有在<many-to-one>标签上配置:
  101. * * 发送多条SQL进行查询.
  102. *
  103. */
  104. public void demo8(){
  105. Session session = HibernateUtils.openSession();
  106. Transaction tx = session.beginTransaction();
  107. //只会发送一条查询订单的SQL.
  108. Order order = (Order) session.get(Order.class, 1);
  109.  
  110. //使用订单的客户对象的时候,又发送一条SQL查询订单关联的客户
  111. System.out.println(order.getCustomer().getCname());
  112. tx.commit();
  113. session.close();
  114. }
  115.  
  116. @Test
  117. /*
  118. * 在<set>集合上配置
  119. * * fetch="subselect" lazy="true"
  120. * * 使用subselect的时候 需要使用query接口进行测试.
  121. * * 如果查询一个客户 查询多个客户.
  122. * 如果有多个客户:
  123. * * select * from orders where cno in (1,2,3);
  124. * 如果只有一个客户:
  125. * * select * from orders where cno = 1;
  126. */
  127. public void demo7(){
  128.  
  129. Session session = HibernateUtils.openSession();
  130. Transaction tx = session.beginTransaction();
  131.  
  132. List<Customer> list = session.createQuery("from Customer").list();
  133.  
  134. for (Customer customer : list) {
  135. System.out.println(customer.getOrders().size());
  136. }
  137.  
  138. tx.commit();
  139. session.close();
  140.  
  141. }
  142. @Test
  143. /*
  144. * 在<set>集合上配置
  145. * * fetch="select" lazy="extra"
  146. * * lazy:extra:极其懒惰.要订单的数量
  147. */
  148. public void demo6(){
  149.  
  150. Session session = HibernateUtils.openSession();
  151. Transaction tx = session.beginTransaction();
  152. Customer customer = (Customer) session.get(Customer.class, 1);
  153. // select count(*) from orders where cno = ?;
  154. System.out.println(customer.getOrders().size());
  155. //发送查询订单的SQL.
  156. for (Order order : customer.getOrders()) {
  157. System.out.println(order);//使用订单的是时候它才会发送查询订单的SQL.
  158. }
  159.  
  160. tx.commit();
  161. session.close();
  162.  
  163. }
  164. @Test
  165. /*
  166. * 在<set>集合上配置
  167. * * fetch="select" lazy="false"
  168. * * lazy:false:关联对象的检索不使用延迟
  169. */
  170. public void demo5(){
  171.  
  172. Session session = HibernateUtils.openSession();
  173. Transaction tx = session.beginTransaction();
  174. // 发送多条SQL,查询关联对象.
  175. Customer customer = (Customer) session.get(Customer.class, 1);
  176. // 使用订单的时候又发送一条查询这个客户的订单的SQL
  177. System.out.println(customer.getOrders().size());
  178.  
  179. tx.commit();
  180. session.close();
  181.  
  182. }
  183. @Test
  184. /*
  185. * 在<set>集合上配置
  186. * * fetch="select" lazy="true"
  187. * * lazy:true-使用延迟检索
  188. * * 发送多条SQL,查询关联对象
  189. */
  190. public void demo4(){
  191.  
  192. Session session = HibernateUtils.openSession();
  193. Transaction tx = session.beginTransaction();
  194. // 发送一条只查询客户的SQL
  195. Customer customer = (Customer) session.get(Customer.class, 1);
  196. // 使用订单的时候又发送一条查询这个客户的订单的SQL
  197. System.out.println(customer.getOrders().size());
  198.  
  199. tx.commit();
  200. session.close();
  201.  
  202. }
  203. @Test
  204. /*
  205. *
  206. * <set>配置fetch="join" lazy就会被忽略!!!!
  207. * * 发送迫切左外连接查询两个表.
  208. */
  209. public void demo3(){
  210.  
  211. Session session = HibernateUtils.openSession();
  212. Transaction tx = session.beginTransaction();
  213. //直接发送一条迫切左外连接。其实迫切左外连接和左外连接的SQL语句是一样的.只不过封装的对象不一样.
  214. //迫切左外连接封装到一个对象里.而普通左外连接封装到一个数组里.
  215. //只要一查客户订单就出来了.
  216. /*
  217. * Hibernate:
  218. select
  219. customer0_.cid as cid0_1_,
  220. customer0_.cname as cname0_1_,
  221. orders1_.cno as cno0_3_,
  222. orders1_.oid as oid3_,
  223. orders1_.oid as oid1_0_,
  224. orders1_.addr as addr1_0_,
  225. orders1_.cno as cno1_0_
  226. from
  227. Customer customer0_
  228. left outer join
  229. orders orders1_
  230. on customer0_.cid=orders1_.cno
  231. where
  232. customer0_.cid=?
  233.  
  234. */
  235. Customer customer = (Customer) session.get(Customer.class, 1);
  236.  
  237. System.out.println(customer.getOrders().size());
  238.  
  239. tx.commit();
  240. session.close();
  241.  
  242. }
  243.  
  244. @Test
  245. /*
  246. *
  247. * <set>没有配置fetch 和 lazy情况
  248. *
  249. */
  250. public void demo2(){
  251. Session session = HibernateUtils.openSession();
  252. Transaction tx = session.beginTransaction();
  253.  
  254. Customer customer = (Customer) session.get(Customer.class,1);// 发送查询客户的SQL.
  255. //System.out.println(customer.getCname());
  256.  
  257. System.out.println(customer.getOrders().size());// 使用了客户的订单的时候,才会发送查询订单的SQL. 又发送一条SQL 去查询客户的关联的订单.
  258. tx.commit();
  259. session.close();
  260. }
  261.  
  262. @Test
  263. /*区分立即检索和延迟检索
  264. *
  265. *
  266. */
  267. public void demo1(){
  268.  
  269. Session session = HibernateUtils.openSession();
  270. Transaction tx = session.beginTransaction();
  271.  
  272. //立即检索
  273. //
  274. /* Customer customer = (Customer) session.get(Customer.class, 1);
  275. System.out.println(customer);*/
  276. //延迟检索:
  277. // 持久化类如果设置为final 延迟检索就失效了.因为不能生成代理对象
  278. // 在Customer.hbm.xml中在<class>标签上配置lazy="false"不支持延迟检索,就会立即检索.
  279. Customer customer = (Customer) session.load(Customer.class, 1);//这是类级别的检索
  280. //System.out.println(customer);//如果这一行注释的话根本就不会发送SQL语句,你执行完了它也不会发送,因为你根本没有
  281. //用到它里面的属性。
  282. //初始化代理对象 发送SQL语句 产生代理对象 那肯定就能拿出来了
  283. //System.out.println(customer.getCname());
  284.  
  285. //还可以这样来初始化代理对象
  286. Hibernate.initialize(customer);//当你初始化的时候它才会发送SQL语句
  287. tx.commit();
  288. session.close();
  289.  
  290. }
  291.  
  292. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5.  
  6. <hibernate-mapping package="cn.itcast.vo"><!-- 如果这里配置了包名下面可以不用写 -->
  7. <!--
  8. <hibernate-mapping>
  9. -->
  10. <!--
  11. <class name="cn.itcast.hibernate3.demo2.Customer" table="customer">
  12. -->
  13. <!--
  14. <class name="cn.itcast.vo.Customer" table="customer">
  15. -->
  16. <class name="Customer" batch-size="2" table="customer">
  17. <!-- 配置唯一标识 -->
  18. <id name="cid" column="cid">
  19. <generator class="native"/>
  20. </id>
  21. <!-- 配置普通属性 -->
  22. <property name="cname" column="cname" length="30"/>
  23.  
  24. <!-- 建立映射 -->
  25. <!-- 配置一个集合 <set>的name Customer对象中的关联对象的属性名称. -->
  26. <!-- 这里把级联去掉 要最简短的配置
  27. <set name="orders" cascade="save-update" inverse="true">
  28. -->
  29. <set name="orders" cascade="save-update" batch-size="2">
  30. <!-- <key>标签中column:用来描述一对多多的一方的外键的名称. -->
  31. <key column="cno"></key>
  32. <!-- 配置一个<one-to-many>标签中class属性:订单的类的全路径 -->
  33. <!--
  34. <one-to-many class="cn.itcast.hibernate3.demo2.Order"/>
  35. -->
  36. <one-to-many class="cn.itcast.vo.Order"/>
  37. </set>
  38. </class>
  39. <!-- 命名查询的方式 -->
  40. <query name="findAll">
  41. from Customer
  42. </query>
  43. <!-- 这里要写sql语句
  44. <sql-query>
  45.  
  46. </sql-query>
  47. -->
  48. </hibernate-mapping>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <!--
  7. <class name="cn.itcast.hibernate3.demo2.Order" table="orders">
  8. -->
  9. <class name="cn.itcast.vo.Order" table="orders">
  10. <!-- 配置唯一标识 -->
  11. <id name="oid" column="oid">
  12. <generator class="native"/>
  13. </id>
  14. <!-- 配置普通属性 -->
  15. <property name="addr" column="addr" length="50"/>
  16. <!-- 配置映射 -->
  17. <!--
  18. <many-to-one>标签
  19. name :关联对象的属性的名称.
  20. column :表中的外键名称.
  21. class :关联对象类的全路径
  22. -->
  23. <!--
  24. <many-to-one name="customer" column="cno" class="cn.itcast.hibernate3.demo2.Customer"/>
  25. -->
  26. <many-to-one name="customer" column="cno" class="cn.itcast.vo.Customer"/>
  27.  
  28. </class>
  29. </hibernate-mapping>
  1. package cn.itcast.vo;
  2.  
  3. import java.util.HashSet;
  4. import java.util.Set;
  5.  
  6. /**
  7. * 客户的实体:
  8. * @author 姜涛
  9. *
  10. */
  11. public class Customer {
  12. private Integer cid;
  13. private String cname;
  14.  
  15. public Customer() {//无参构造函数
  16. super();
  17. // TODO Auto-generated constructor stub
  18. }
  19.  
  20. public Customer(String cname) {//有参构造
  21. super();
  22. this.cname = cname;
  23. }
  24.  
  25. // 一个客户有多个订单.
  26. private Set<Order> orders = new HashSet<Order>();
  27. public Integer getCid() {
  28. return cid;
  29. }
  30. public void setCid(Integer cid) {
  31. this.cid = cid;
  32. }
  33. public String getCname() {
  34. return cname;
  35. }
  36. public void setCname(String cname) {
  37. this.cname = cname;
  38. }
  39. public Set<Order> getOrders() {
  40. return orders;
  41. }
  42. public void setOrders(Set<Order> orders) {
  43. this.orders = orders;
  44. }
  45. //@Override
  46. /* public String toString() {//客户这里打印也打印出订单的集合。这是死循环了,所以这里应该去掉一方的打印。
  47. return "Customer [cid=" + cid + ", cname=" + cname + ", orders="
  48. + orders + "]";
  49. return "Customer [cid=" + cid + ", cname=" + cname + "]";//客户这里去掉订单集合的打印
  50.  
  51. }*/
  52. //测试迫切内连接的封装效果。重写toString()方法
  53. @Override
  54. public String toString() {
  55. return "Customer [cid=" + cid + ", cname=" + cname + ", orders="
  56. + orders + "]";
  57. }
  58. }
  1. package cn.itcast.vo;
  2. /**
  3. * 订单的实体:
  4. * @author 姜涛
  5. *
  6. */
  7. public class Order {
  8. private Integer oid;
  9. private String addr;
  10. // 订单属于某一个客户.放置一个客户的对象.
  11. private Customer customer;
  12. public Integer getOid() {
  13. return oid;
  14. }
  15. public void setOid(Integer oid) {
  16. this.oid = oid;
  17. }
  18. public String getAddr() {
  19. return addr;
  20. }
  21. public void setAddr(String addr) {
  22. this.addr = addr;
  23. }
  24. public Customer getCustomer() {
  25. return customer;
  26. }
  27. public void setCustomer(Customer customer) {
  28. this.customer = customer;
  29. }
  30. //@Override
  31. /* public String toString() {//订单这边又打印客户了。这是死循环了,所以这里应该去掉一方的打印。
  32. return "Order [oid=" + oid + ", addr=" + addr + ", customer="
  33. + customer + "]";
  34. }*/
  35. //测试迫切内连接的封装效果。重写toString()方法
  36. @Override
  37. public String toString() {//两边不能同时打印,不然容易出问题
  38. return "Order [oid=" + oid + ", addr=" + addr + "]";
  39. }
  40.  
  41. }

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. 19-11-1-N

    就剩一个键了…… 以后怎么办呢? 也许可以试试字符映射表……(滑稽 ZJ一下: 我还以为我要死了…… 40 Miemeng 10 03:21:50 80 03:21:51 10 03:21:51 10 ...

  2. CPU的load和使用率傻傻分不清(转)

    转自: https://www.cnblogs.com/yunxizhujing/p/9382396.html 1. 什么是Cpu的Load 使用uptime.top或者查看/proc/loadavg ...

  3. v-bind:class

    <!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...

  4. PAT甲级——A1068 Find More Coins

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...

  5. 《DSP using MATLAB》Problem 8.12

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  6. Unity优化垃圾回收GC

  7. MyEclipse 最常用实用快捷键

  8. 去掉IE提示:在此页上的ActiveX控件和本页上的其他部分的交互可能不安全。你想允许这种交互吗?

    由于项目需求,需要用到OCX控件.而在IE浏览器中加载OCX控件会有如下提示: 这是因为OCX控件有一个ID,而这个ID注册后IE不认为该OCX控件是安全的.所以,必须把这个控件注册为安全控件. 假设 ...

  9. [转]深入WPF--Style

    Style 用来在类型的不同实例之间共享属性.资源和事件处理程序,您可以将 Style 看作是将一组属性值应用到多个元素的捷径. 这是MSDN上对Style的描述,翻译的还算中规中矩.Style(样式 ...

  10. svn 设置快捷命令

    # some more svn aliases alias svnset='svn propset svn:externals . -F' alias svnget='svn propget svn: ...