MyBatis多表查询结果之多表映射(ResultMap)(一图读懂多表映射)
1、MyBatis多表映射 介绍
MyBatis 的多表映射通常用于从多个表中查询数据并将结果映射到一个 Java 实体类中。在多表查询的情况下,查询结果会包含多个表的字段,这时我们需要一个实体类来存储这些字段。由于数据库表中的字段名可能与实体类的属性名不一致,我们就需要使用 MyBatis 提供的映射机制来解决这个问题。主要的映射方式包括 resultMap、association 和 collection 标签,它们可以帮助我们将查询结果正确地映射到 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!