Chapter5Chapter5_第1页
Chapter5Chapter5_第2页
Chapter5Chapter5_第3页
Chapter5Chapter5_第4页
Chapter5Chapter5_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Chapter5高级使用和缓存*课程审查*1 .一对一的关系2.1比1的方法23 .一对多关系*教育导航*1 .懒惰的道路2 .一次、二次高速缓存3 .存储过程调用1 .懒惰的道路前面的框架介绍了Hibernate可以通过延迟加载提高效率,并介绍了如何通过懒惰加载提高mybatis的查询效率。什么是懒惰之路? 也称为延迟加载,一般是指按需加载,在必要时做什么。 另外,首先从单个表中执行查询,然后根据需要从关系表中执行查询,可以大大提高数据库的性能。 这是因为查询表单比关系式查询中的多个表快。在mybatis中,resultMap可以实现高级映射(使用association、collection实现1对1和1对多的映射,在前一章中进行了说明),association、collection具有延迟加载功能实现订单信息查询,可能需要关联并发现用户信息。第一个方法是直接将所有订单和用户信息关联起来查询从顺序o,用户u where o .用户_ id=u.id;在这里,我们一次调查所有的信息,需要什么信息的时候,从直接咨询的结果中筛选出来。 然而,如果订单和用户表都很大,则该相关查询肯定会花费很长的时间。我们的需要有时需要关联用户信息来查询,这里不一定需要用户信息。 也就是说,有时不需要查询用户信息,我们也进行了调查,程序进行了花费多馀时间的操作。第二种方法是分阶段查询所有订单信息,然后根据所查询的订单信息来关联用户信息select * from orders; /查询所有订单信息,包括用户id/如果需要用户信息,请根据在上一步骤中查询的用户id来查询用户信息select * from user where id=user_id分析:,这里两个阶段都是单表查询,执行效率高于相关查询分为两个阶段,如果没有必要将用户信息建立关联,就没有必要执行第二阶段,程序不进行多馀的操作。这第二个方法是我的巴士懒惰之路。具体例子:创建javaWeb工程项目MyBatisFive (请参见MyBatisFour项目的一部分)1、Sql语句的准备:select * from my_orders; /查询所有订单信息,包括用户idselect * from user where id=user_id定义pojo:User.java私有集成器id;私有字符串用户名称;以及/用户名私有字符串sex; /性别私有日期二进制; /生日私有字符串地址;PS; /地址/一个用户可以创建多个订单,用户和订单构成一对多的关系公共列表顺序;的;省略get and set方法以下Order.java公共等级顺序。和私有整合子id;私有集成器用户;私有integer用户;私有字符串编号;私有数据创建时间;的;私有字符串注释;的;/与用户表构成一对一的关系。 也就是说,一个订单只能由一个用户创建专用用户;省略get and set方法以下Mapper接口创建UserMapper.javapublicationinterfaceusermapper/*获取*select*fromorder/user_id* select * from user WHERE id=1 /1是在上一个查询中获取的user_id的值*/获取订单信息(包括user_id )公共列表getorderbyorderid ();/通过用户ID查询用户信息publicusergetuserbyuserid (int userid )以下映射文件UserMapper.xmlXML版本= 1.0 编码= utf-8 ?select * from my_orders从select *用户where id=# id 4、我的MyBatis核心配置文件加载映射器接口中间省略数据连接部分5 .建立测试类和方法UserOrdersTets类:(查询方法的部分已更改。)请参见publicvoidqueybyall () () )列表=空;SqlSession sqlSession=null;try/创建数据库会话实例sqlSessionSQL session=sqlsessionfactory.open session ();/受限制的mapper接口示例用户映射器用户映射器=SQL session.get映射器(用户映射器. class )listo orders=user mapper.getorderedbyorderid (); /第一步输入for (订单:订单)system.out.println (order.getuser () ); /第二步以下 catch (exceptive ) catch (exceptive ) e .打印堆栈跟踪(); finally PD会话!=空值)sqlSession.close ();以下以下以下要观察执行结果,首先在上面识别的第一步中设置中断点,然后调试中断点。 第一次进入断点:请注意,控制台没有发出sql语句下一步:此步骤首先发出查询所有订单信息的sql语句。 select * from my_orders。 注意只查询订单信息,还没有进行相关查询下一步:下图执行for循环。 因为需要用户信息,所以发出了根据用户id查询用户信息的sql语句总结:在以上示例中,应理解懒惰负载的原理是按需负载。 我们在需要什么信息的时候去调查。 不是一次查询一切。 将复杂的相关查询分解成单个表查询,并基于单个表查询的结果来关联查询。即使不使用我总线的懒惰之路,我们也能实现上述例子1 .定义两个mapper方法1 .查询订单清单2 .基于用户id查询用户信息二、首先调查最初的mapper方法,取得订单信息的列表,放入收藏集中三、如果需要用户信息,可以在程序中遍历订单信息,获取用户id,用id查询用户信息。这和mybatis懒惰加载的区别在于,mybatis与mapper.xml文件相关联,所以我们可以直接调用它。 自己实现的原理是手动建立关系。二、一级和二级高速缓存mybatis提供查询缓存,如果缓存中有数据,则不需要从数据库获取数据,mybatis使用两个缓存、一级缓存和二级缓存来减轻数据压力并提高系统性能1、主高速缓存是SqlSession级别的高速缓存。 缺省情况下,打开一级高速缓存,在使用数据库时需要构建sqlSession对象,并在对象中具有数据结构(HashMap )以存储高速缓存数据。 不同sqlSession之间的缓存数据区域(HashMap )不会相互影响。2、辅助缓存是映射器级缓存,多个SqlSession操作同一映射器的sql语句,多个SqlSession可以共享辅助缓存,而辅助缓存跨越SqlSession。3 .关于缓存数据的更新机制,在某个范围(主缓存Session/辅助缓存Namespaces )中执行C/U/D操作时,默认情况下,该范围的所有select的缓存都被清除。#一次高速缓存#1、我们在sqlSession中,根据id对User表进行两次查询,调查他们发出sql语句的情况。publicvoidtestselectorderanduserbyorderid (); 请参见。使用sqlSessionFactory生成sessionsqlsessionsqlsession=session factory.open session ();用户映射=SQL session.get映射器(用户映射器. class )/第一个查询发出sql语句,并缓存查询的结果用户1=用户映射. selectuserbyuserid (1)System.out.println(u1 )/第二个查询是相同的sqlSession,因此会在高速缓存中搜索查询结果/如果有,直接从缓存中取出,不与数据库对话user U2=user mapper.selectuserbyuserid (1)System.out.println(u2 )。sqlSession.close ();以下2、在同一用户表中进行了两次查询,但在查询之间进行了一次更新操作。publicvoidtestselectorderanduserbyorderid (); 请参见。使用sqlSessionFactory生成sessionsqlsessionsqlsession=session factory.open

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论