首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Mybatis—查询resultMap-多表关联{association-collection}–延迟加载

Mybatis—查询resultMap-多表关联{association-collection}–延迟加载

作者头像
Java架构师必看
发布2021-05-14 16:48:38
发布2021-05-14 16:48:38
1.6K0
举报
文章被收录于专栏:Java架构师必看Java架构师必看

resultMap

resultMap: 结果映射。 自定义列名和java对象属性的对应关系。 常用在列名和属性名不同的情况。

用法:

1.先定义 resultMap标签, 指定列名和属性名称对应关系

2.在select标签使用resultMap属性,指定上面定义的resultMap的id值

代码语言:javascript
复制
    <resultMap id="studentMap" type="com.nie.domain.Student">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="email" property="email"/>
        <result column="age" property="age"/>
    </resultMap>


    <select id="selectById2" resultMap="studentMap">
      select id,name,email,age from student where id=#{stuid}
    </select>

多表关联处理结果集

resultMap元素中association,collection元素

association

–复杂类型联合;许多查询结果合成这个类型

一对一结果映射-association,能引用自身,或者从其他地方引用collection-复杂类型集合

collection

–复杂类型集合

嵌套结果映射–collection能引用自身,或者从其它地方引用与一对多

关联-association一对一,,多对一

集合-collection一对多

相关的association与collection区别

案例

association

代码语言:javascript
复制
   <resultMap id="empMap" type="com.nie.domain.Emp">
        <id column="eid" property="id"/>
        <result column="ename" property="name"/>
        <result column="age" property="age"/>


        <!--关联的对象-->
        <association property="dept" javaType="com.nie.domain.Dept">
            <id column="did" property="id"/>
            <result column="dname" property="name"/>
            <result column="deptDesc" property="deptDesc"/>
        </association>

    </resultMap>

    <!-- 公共的-->
    <sql id="result">
          e.id eid,
  e.name ename,
  e.age,
  d.id did,
  d.name dname,
  d.dept_desc  deptDesc
    </sql>

    <select id="selectById" resultMap="empMap">
SELECT
  e.id eid,
  e.name ename,
  e.age,
  d.id did,
  d.name dname,
  d.dept_desc  deptDesc
FROM
  emp e
  LEFT JOIN dept d
    ON e.dept_id = d.id
WHERE e.id = #{id}
    </select>


    <!-- 查询所有的员工-->
    <select id="findEmpById" resultMap="empMap">
        SELECT
        <include refid="result"></include>
        FROM
        emp e
        LEFT JOIN dept d
        ON e.dept_id = d.id
    </select>

collection

代码语言:javascript
复制
<resultMap id="deptMap" type="com.nie.domain.Dept">
        <id column="did" property="id"/>
        <result column="dname" property="name"/>
        <result column="deptDesc" property="deptDesc"/>
        <!-- 查询到的多个员工对象,再将多个对象 封装集合-->
        <collection property="empList" javaType="list" ofType="com.nie.domain.Emp">
            <id column="eid" property="id"/>
            <result column="ename" property="name"/>
            <result column="age" property="age"/>
        </collection>
    </resultMap>


    <select id="findDeptById" resultType="com.nie.domain.Dept" resultMap="deptMap">
  SELECT
    e.id eid,
  e.name ename,
  e.age,
  d.id did,
  d.name dname,
  d.dept_desc  deptDesc
FROM
  dept d
  LEFT JOIN emp e
    ON d.`id` = e.`dept_id`
WHERE d.id = #{id}
    </select>
相关类
Emp
代码语言:javascript
复制
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
   
    private int id;
    private String name;
    private int age;
    private Dept dept;

}
Dept
代码语言:javascript
复制
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
   
    private int id;
    private String name;
    private String deptDesc;
    private List<Emp> empList;

}

Mybatis延迟加载的实现方式

概念:

mybatis的延迟加载,也称为懒加载,是指在进行表关联查询时,按照设置延迟规则推迟对关联对象的select查询,

如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力 mybatis的延迟记载只是对关联对象的查询有延迟设置,对于主动加载对象都是直接执行查询语句的

加载时机

直接加载: 执行完对主加载对象的select语句,马上执行对关联对象的select查询

侵入式延迟: 执行对主加载对象的查询时,不会主动关联对象的查询,但当要访问主加载对象的详情属性,就会马上执行相关对象的select查询

深度延迟: 执行对主加载对象的查询,不会执行对关联对象的查询,。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。

延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

代码语言:javascript
复制
<!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--配置侵入式延迟加载 默认为false(深度加载) 侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询 深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询 -->
    <setting name="aggressiveLazyLoading" value="true"/>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • resultMap
  • 多表关联处理结果集
    • 相关的association与collection区别
  • 案例
    • association
    • collection
    • Mybatis延迟加载的实现方式
      • 概念:
      • 加载时机
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档