当前位置: 首页 > news >正文

mybatis 延迟加载

mybatis 延迟加载

什么是延迟加载

延迟加载又叫懒加载,也叫按需加载,也就是说先加载主信息,需要的时候,再去加载从信息。代码中有查询语句,当执行到查询语句时,并不是马上去DB中查询,而是根据设置的延迟策略将查询向后推迟。

什么时候会执行延迟加载

配置之后在对关联对象进行查询时使用延迟加载。

延迟加载策略
直接加载

遇到代码中查询语句,马上到DB中执行select语句进行查询。(这种只能用于多表单独查询)

侵入式延迟加载

将关联对象的详情(具体数据,如id、name)侵入到主加载对象,作为主加载对象的详情的一部分出现。当要访问主加载对象的详情时才会查询主表,但由于关联对象详情作为主加载对象的详情一部分出现,所以这个查询不仅会查询主表,还会查询关联表。

深度延迟加载

将关联对象的详情(具体数据,如id、name)侵入到主加载对象,作为主加载对象的详情的一部分出现。当要访问主加载对象的详情时才会查询主表,但由于关联对象详情作为主加载对象的详情一部分出现,所以这个查询不仅会查询主表,还会查询关联表。

使用延迟加载的目的

减轻DB服务器的压力,因为我们延迟加载只有在用到需要的数据才会执行查询操作。

配置
    <settings>
        <setting name ="aggressiveLazyLoading" value="false"/>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
复制代码

我们用关联查询来实现延迟加载,假设我们现在要查出用户和用户角色。

首先我们在user中添加查询userVo的方法和xml。

<!--userMapper.xml-->

....
<resultMap id="BaseResultMap" type="com.redstar.basemapper.pojo.User">
        <id column="id" jdbcType="VARCHAR" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
        <result column="age" jdbcType="INTEGER" property="age"/>
        <result column="role_id" jdbcType="INTEGER" property="roleId"/>
    </resultMap>
    <resultMap id="userRoleMapSelect" type="com.redstar.basemapper.pojo.UserVo">
        <association property="user" resultMap="BaseResultMap"/>
        <association property="role" fetchType="lazy" column="{id=role_id}"
                     select="com.redstar.basemapper.dao.RoleMapper.getRoleById"/>
    </resultMap>
    <sql id="Base_Column_List">
    id, `name`, age, role_id
  </sql>
    <select id="getUserVo" resultMap="userRoleMapSelect">
      select * from user where id=#{userId}
    </select>
...
    
    
    
    <!--roleMapper.xml-->
...    
    <resultMap id="BaseResultMap" type="com.redstar.basemapper.pojo.Role">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="role_name" jdbcType="VARCHAR" property="roleName" />
  </resultMap>
  <sql id="Base_Column_List">
    id, role_name
  </sql>
  <select id="getRoleById" resultMap="BaseResultMap">
    select * from role where id=#{id}
  </select>
...  
复制代码

测试用例

@RunWith(SpringRunner.class)
@SpringBootTest
public class BaseMapperApplicationTests {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RoleMapper roleMapper;

    @Test
    public void getUserVo() {
        System.out.println(userMapper.getUserVo("12312232"));
//        System.out.println(userMapper.getUserById("12312232"));
//        System.out.println(roleMapper.getRoleById(1));

    }


}
复制代码

输出结果:

UserVo{user=User [Hash = 1937575946, id=12312232, name=哇哈哈啊娃哈哈哇哈哈哈哈哈哈哈, age=48, roleId=1, serialVersionUID=1], role=Role [Hash = 317053574, id=1, roleName=admin, serialVersionUID=1]}
复制代码
注意

许多对延迟加载原理不太熟悉的朋友会经常遇到一些莫名其妙的问题:有些时候延迟加载 可以得到数据,有些时候延迟加载就会报错,为什么会出现这种情况呢? MyBatis 延迟加载是通过动态代理实现的,当调用配直为延迟加载的属性方法时, 动态代 理的操作会被触发,这些额外的操作就是通过 MyBatis 的 SqlSessio口去执行嵌套 SQL 的 。 由于在和某些框架集成时, SqlSession 的生命周期交给了框架来管理,因此当对象超出 SqlSession 生命周期调用时,会由于链接关闭等问题而抛出异常 。 在和 Spring 集成时,要 确保只能在 Service 层调用延迟加载的属性 。 当结果从 Service 层返回至 Controller 层时, 如果 获取延迟加载的属性值,会因为 SqlSessio口已经关闭而抛出异常 。

相关文章:

  • Python基础学习四 列表、元组、字典、集合
  • Mysql添加更新删除数据-表
  • 如何在本地测试Fabric Code
  • 状态码 301 与 302的区别
  • RHEL6 搭建LVS/DR 负载均衡集群 案例
  • “-Xmx1024m -Xms1024m -Xmn512m -Xss256k”——Java运行参数
  • Linux权限详解
  • Tomcat7 Redis Session共享
  • 练习题
  • C#Vs关于连接数据库的语句
  • openssl windows 生成公钥与私钥
  • 使用xUnit为.net core程序进行单元测试 -- Assert
  • AI+社交,快手商业化落地之道
  • mysql数据表删除字段里重复的信息
  • 挖掘机动臂(大臂)无力的诊断与排除怎么检查呢?
  • @angular/forms 源码解析之双向绑定
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • HomeBrew常规使用教程
  • oschina
  • React系列之 Redux 架构模式
  • Vue 2.3、2.4 知识点小结
  • Vue UI框架库开发介绍
  • Yeoman_Bower_Grunt
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 回流、重绘及其优化
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 详解移动APP与web APP的区别
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ionic异常记录
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • (Python第六天)文件处理
  • (二十四)Flask之flask-session组件
  • (黑马C++)L06 重载与继承
  • (十一)图像的罗伯特梯度锐化
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ***利用Ms05002溢出找“肉鸡
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net Redis的秒杀Dome和异步执行
  • .net(C#)中String.Format如何使用
  • @Conditional注解详解
  • [04]Web前端进阶—JS伪数组
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [HNOI2018]排列
  • [java基础揉碎]方法的重写/覆盖
  • [jQuery]10 Things I Learned from the jQuery Source
  • [Linux]于Mac在配置Linuxserver安装Nginx+PHP
  • [PHP]禅道项目管理软件ZenTaoPMS源码包 v16.4