Mybatis加载策略的实现方法

目录
  • MaBatis加载策略
    • 1.什么是延迟加载
    • 1.2实现
      • 1.2.1局部延迟加载
      • 1.2.2设置触发延迟加载的方法
      • 1.2.3全局延迟加载

MaBatis加载策略

1.什么是延迟加载

Mybatis中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的订单信息。此时就是我们所说的延迟加载。

例如:

问题1:在一对多中,当我们有一个用户,它有个100个订单在查询用户的时候,要不要把关联的订单查出来?

  • 回答:在查询用户时,用户下的订单应该是,什么时候用,什么时候查询。(一对多)

**问题2:**在查询订单的时候,要不要把关联的用户查出来?

  • 在查询订单时,订单所属的用户信息应该是随着订单一起查询出来。(多对一) 1.1延迟加载

就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。

注意:

延迟加载是基于嵌套查询来实现的

  • 优点:

先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表
速度要快。

  • 缺点:

因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时
间,所以可能造成用户等待时间变长,造成用户体验下降。

  • 在多表中:

一对多,多对多:通常情况下采用延迟加载
一对一(多对一):通常情况下采用立即加载

1.2实现

1.2.1 局部延迟加载

在association和collection标签中都有一个fetchType属性,通过修改它的值,可以修改局部的加载策略。

xml配置文件:

<!--
嵌套查询:查询用户所对应的订单
-->
    <resultMap id="getUserInfoWithNested" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>
        <!--
        fetchType="lazy" 懒加载策略
        fetchType="eager" 立即加载策略
    -->
        <collection property="ordersList" ofType="com.lagou.domain.Orders" select="com.lagou.mapper.OrdersMapper.findUserAllOrder" column="id" fetchType="lazy" ></collection>
    </resultMap>
    <select id="findUserOrder2" resultMap="getUserInfoWithNested">
        select * from user
    </select>

1.2.2 设置触发延迟加载的方法

  • 大家在配置了延迟加载策略后,发现即使没有调用关联对象的任何方法,但是在你调用当前对象的equals、clone、hashCode、toString方法时也会触发关联对象的查询。
  • 我们可以在配置文件中使用lazyLoadTriggerMethods配置项覆盖掉上面四个方法。
<!--    设置延迟加载策略-->
    <settings>
		<!--        所有方法都会延迟加载-->
        <setting name="lazyLoadTriggerMethods" value="toString()"/>
    </settings>

1.2.3全局延迟加载

  • 引入全局延迟加载,目的是解放局部延迟加载在标签collection中加入一直家fetchType参数。从而可以做到所有的嵌套查询是实现全局延迟加载。
  • 在Mybatis的核心配置文件中可以使用setting标签修改全局的加载策略。
<settings>
<!--        所有方法都会延迟加载-->
        <setting name="lazyLoadTriggerMethods" value="toString()"/>
        <!--开启全局延迟加载功能-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

注意:局部的加载策略优先级高于全局的加载策略。

订单没有被查询出来:

到此这篇关于Mybatis加载策略的文章就介绍到这了,更多相关Mybatis加载策略内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis中延迟加载Lazy策略的方法

    lazy策略原理:只有在使用查询sql返回的数据是才真正发出sql语句到数据库,否则不发出(主要用在多表的联合查询) 1.一对一延迟加载: 假设数据库中有person表和card表:其中person表中有字段pid,pname,page,psex,cid,card表中有字段cid,cnum; 假设要查询某个人的姓名和身份证号码: 原理:在查询姓名时,实际本没有查询出身份证号码的信息,只有当前台使用身份证号时才发出对card的查询,需要查询出身份证号码是采取查询的一种策略: 实现实例: 实现步骤:

  • Mybatis加载策略的实现方法

    目录 MaBatis加载策略 1.什么是延迟加载 1.2实现 1.2.1局部延迟加载 1.2.2设置触发延迟加载的方法 1.2.3全局延迟加载 MaBatis加载策略 1.什么是延迟加载 Mybatis中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询.实际开发过程中很多时候我们并不需要总是在加载用户信息时就一定要加载他的订单信息.此时就是我们所说的延迟加载. 例如: 问题1:在一对多中,当我们有一个用户,它有个100个订单在查询用户的时候,要不要把关联的订单查出来? 回答:在查询

  • mybatis 加载配置文件的方法(两种方式)

    一. 使用sqlSessionFactory 的 mapperLocations 进行加载, <!-- SessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="singleton"> <property name="dataSource" ref=

  • 浅谈angular2路由预加载策略

    1.问题描述 在没有使路由懒加载的时候,第一次使用的时候加载特别慢,影响用户体验,angular2可以使用loadChildren进行懒加载,第一次使用的时候只会加载需要的模块,其它模块在真正使用的时候才会去加载,这个时候打开浏览器控制台查看js加载的时候,会发现你在使用时候会去加载对应的js,导致第一次点击相应模块的功能时会卡顿一下,后面在使用就不会了,这样还是用户体验不好,接下来告诉你如果使用预加载策略解决这个问题. 2.预加载策略 RouterModule.forRoot的第二个添加了一个

  • 在Vue.js中加载字体的正确方法

    添加字体不应该对性能产生负面影响.在本文中,我们将探讨在 Vue 应用程序中加载字体的最佳实践. 正确声明 font-face 的字体 确保正确声明字体是加载字体的重要方面.这是通过使用 font-face 属性来声明你选择的字体来实现的.在你的 Vue 项目中,这个声明可以在你的根 CSS 文件中完成.在进入这个问题之前,我们先来看看 Vue 应用的结构. /root public/ fonts/ Roboto/ Roboto-Regular.woff2 Roboto-Regular.woff

  • angular+ionic 的app上拉加载更新数据实现方法

    第一步,首先需要在<ion-content>标签里面加入标签<ion-infinite-scroll ng-if="hasmore" on-infinite="loadMore()" distance="5%"></ion-infinite-scroll> 里面的属性解释, ng-if  值 布尔型,如果为true,则可以触发上拉事件 on-infinite 上拉时触发的事件 distance 列表底部滚动到可

  • jquery实现ajax加载超时提示的方法

    本文实例讲述了jquery实现ajax加载超时提示的方法.分享给大家供大家参考,具体如下: index.php <!doctype html> <html> <head> <meta charset="utf-8"/> <title>加载超时</title> <script type="text/javascript" src="http://lib.sinaapp.com/js

  • javascript实现加载xml文件的方法

    本文实例讲述了javascript加载xml文件的方法.分享给大家供大家参考,具体如下: //需要读取的xml文件 var uRl = "jsReadXml.xml"; var xmlDoc; //初始化,给上述定义变量赋值 // function showcurcity(){ if(window.ActiveXObject) { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="fal

  • jquery及js实现动态加载js文件的方法

    本文实例讲述了jquery及js实现动态加载js文件的方法.分享给大家供大家参考,具体如下: 问题: 如果用jquery append直接加载script标签的话,会报错的.除了document.write外,还有没有其他的比较好的动态加载js文件的方法. 解决方法: 1.jquery方法 $.getScript("./test.js"); //加载js文件 $.getScript("./test.js",function(){ //加载test.js,成功后,并执

  • 前端图片懒加载(lazyload)的实现方法(提高用户体验)

    定义 图片懒加载又称图片延时加载.惰性加载,即在用户需要使用图片的时候加载,这样可以减少请求,节省带宽,提高页面加载速度,相对的,也能减少服务器压力. 惰性加载是程序人性化的一种体现,提高用户体验,防止一次性加载大量数据,而是根据用户需要进行资源的请求. 实现 懒加载的难点在于确定某张图片是否是用户需要的资源,在浏览器中,用户需要的是可视区内的资源,因此我们只需要判断图片是否已经呈现在可视区内,当图片呈现在可视区内时,获取图片的真实地址并赋给该图片即可(图片宽高需要指定,可以利用padding处

  • window.showModalDialog两次加载问题清除缓存方法

    今天遇到这样一件事情, 复制代码 代码如下: var frmHeight = 352; var frmWidth = 508; var frmTop = (window.screen.height - frmHeight) / 2; var frmLeft = (window.screen.width - frmWidth / 2); var url = "ChosePerson.aspx"; var parameter = "dialogHeight:" + fr

随机推荐