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

Mybatis查询

resultMap

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

用法:

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

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

    <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

   <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

<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
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
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查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

<!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--配置侵入式延迟加载   默认为false(深度加载)
      侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询
      深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询
    -->
    <setting name="aggressiveLazyLoading" value="true"/>
MyBatis-Plus实现多表查询,可以使用MyBatis的XML映射文件或者注解方式来实现。 1. XML映射文件方式实现多表查询 在XML映射文件中,我们可以使用MyBatis的associationcollection标签,来定义实体类中的关联属性和集合属性。同时,我们可以使用select标签来查询关联表中的数据。例如: ```xml <!-- 定义实体类中的关联属性 --> <resultMap id="UserResultMap" type="User"> <id column="id" property="id"/> <result column="username" property="username"/> <association property="role" javaType="Role"> <id column="rid" property="id"/> <result column="rname" property="name"/> </association> </resultMap> <!-- 查询用户信息和对应的角色信息 --> <select id="getUserAndRole" resultMap="UserResultMap"> SELECT u.id, u.username, r.id as rid, r.name as rname FROM user u LEFT JOIN role r ON u.rid = r.id WHERE u.id = #{id} </select> ``` 2. 注解方式实现多表查询 在实体类中,我们可以使用MyBatis-Plus的@TableField注解来定义关联属性和集合属性,并使用@JoinTable注解来设置关联表的信息。同时,我们可以使用@Select注解来查询关联表中的数据。例如: ```java @Data public class User { private Long id; private String username; // 定义关联属性 @TableField(exist = false) private Role role; } @Data public class Role { private Long id; private String name; } // 查询用户信息和对应的角色信息 @Select("SELECT u.id, u.username, r.id as rid, r.name as rname " + "FROM user u " + "LEFT JOIN role r ON u.rid = r.id " + "WHERE u.id = #{id}") @Results({ @Result(column = "rid", property = "role.id"), @Result(column = "rname", property = "role.name") }) User getUserAndRole(Long id); ``` 以上是MyBatis-Plus实现多表查询的两种方式,可以根据自己的需求选择其中一种方式进行实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值