MyBatis多表查询结果之多表映射(ResultMap)(一图读懂多表映射)

1、MyBatis多表映射 介绍

  MyBatis 的多表映射通常用于从多个表中查询数据并将结果映射到一个 Java 实体类中。在多表查询的情况下,查询结果会包含多个表的字段,这时我们需要一个实体类来存储这些字段。由于数据库表中的字段名可能与实体类的属性名不一致,我们就需要使用 MyBatis 提供的映射机制来解决这个问题。主要的映射方式包括 resultMap、associationcollection 标签,它们可以帮助我们将查询结果正确地映射到 Java 对象,并处理表之间的一对一、一对多等关系。

为了优化多表查询的 MyBatis 映射,应该确保以下几点:

  • 统一命名规则:确保数据库表字段名与 Java 类属性名不匹配时,可以通过注解或 resultMap 显式地指定字段和属性的映射关系。
  • 合理使用 resultMap 标签:通过 resultMap标签,可以在查询结果中使用更细粒度的映射,支持复杂的关系。
  • 尽量避免在 XML 中硬编码字段映射:通过合理的字段映射策略,如使用别名或注解,减少代码冗余。

2、一对一关系

  一对一关系指的是两个实体之间的关联,其中一个实体的每一条记录都与另一个实体的唯一一条记录相对应。
在这里插入图片描述

  在 MyBatis 中,一对一关系可以通过 association 标签来实现。association 标签用于定义两个表之间的关联关系,指定一个表的字段与另一个表的属性映射

2.1、总体图(一图读懂多表映射)

在这里插入图片描述

2.2、后端接收的实体类VehicleInfo设计

select语句查到数据 后端接收的实体类VehicleInfo设计

将下面属性当做主表 属性

  • private int vehicleID;
  • private String vehicleCard;
  • private String vmeID;

将实体类ComAminfoVo当做副表 属性

  • private ComAminfoVo comAminfoVo;

在这里插入图片描述
  与SQL中主表副表不一样,这样设计是因为副表字段都来自实体类ComAminfoVo,方便直接使用该类。不影响查询结果。

2.3、mapper.xml文件

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.amtiot.mapper.ComUserMapper">

<!--    多表映射 (两张表映射)-->
    <resultMap id="VehicleInfoListVo" type="com.example.amtiot.vo.comuser.VehicleInfo">

<!--        amt_vehicleinfo 主表映射-->
        <result property="vehicleID" column="VehicleID"/>
        <result property="vmeID" column="VMEID"/>
        <result property="vehicleCard" column="VehicleCard"/>
<!--        com_aminfo 副表映射 -->
        <association property="comAminfoVo" javaType="com.example.amtiot.vo.comuser.ComAminfoVo">
        <result property="id" column="ID"/>
        <result property="orgVmeID" column="OrgVMEID"/>
        <result property="vmeModel" column="VMEModel"/>
        <result property="amType" column="AmType"/>
        <result property="vehicleNum" column="VehicleNum"/>
        <result property="proName" column="ProName"/>
        <result property="cityName" column="CityName"/>
        <result property="countyName" column="CountyName"/>
        <result property="townName" column="TownName"/>
        <result property="villName" column="VillName"/>
        <result property="ownerName" column="OwnerName"/>
        <result property="ownerTelNum" column="OwnerTelNum"/>
        <result property="createdBy" column="CreatedBy"/>  </association>
    </resultMap>

    <select id="queryAllVehicleInfoByUserId" resultMap="VehicleInfoListVo">
        SELECT  a.VMEModel,a.VehicleNum,a.AmType,a.ID,a.OrgVMEID,
        		c.VehicleID,c.VMEID, c.VehicleCard,
                a.ProName,a.CItyName,a.CountyName,a.TownName,a.VillName,a.OwnerName,a.OwnerTelNum
        FROM com_aminfo  a
        INNER JOIN com_vmeidmapping b ON a.OrgVMEID=b.OrgVMEID
        INNER JOIN amt_vehicleinfo c ON b.VMEID=c.VMEID
        WHERE a.CreatedBy = #{
    
    userID}
    </select>

</mapper>

2.4、目录关系

在这里插入图片描述

3、一对多关系

  各位小哥哥小姐姐们,稍等等嗷,小编正在加紧更新中ing!