MyBatis的学习总结四:实现关联表查询【参考】

一、一对一的表关联查询(edi_test_task  和  edi_task_detail) 例子:一条任务明细对一条任务记录

对应的sql的映射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.cn.mybatis.mapper.taskDetailMapper">
    
      <!-- 
     方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
             封装联表查询的数据(去除重复的数据)
     -->
    <select id="getTaskDetailById" parameterType="String" resultMap="taskDetail">
        select * from edi_task_detail where detail_id=#{detailId}
    </select>
    <resultMap type="EdiTaskDetail" id="taskDetail">
        <id property="detail_id" column="detail_id"/>
        <association property="editt" javaType="EdiTestTask">
            <id property="task_id" column="task_id"/>
        </association>
    </resultMap>
    
      <!-- 
       方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
         select * from edi_task_detail where detail_id=‘a8681f896898417caaf934b9707b961e’;
         SELECT * FROM edi_test_task where task_id=‘5fd0998a07c84d9d924076f64fb726a7’    //5fd0998a07c84d9d924076f64fb726a7 是明细对应的task_id的值
     -->
    <select id="getTdById" parameterType="String" resultMap="editD">
        select * from edi_task_detail where detail_id=#{detailId}
    </select>
    <resultMap type="EdiTaskDetail" id="editD">
        <id property="detail_id" column="detail_id"/>
        <association property="editt" column="task_id" select="getTaskById"></association>
    </resultMap>
    
    <select id="getTaskById" parameterType="String" resultType="EdiTestTask">
        SELECT * FROM edi_test_task where task_id=#{task_id}
    </select>
</mapper>

 总结——Mybatis一对一表查询:MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:

  • property:对象属性的名称
  • javaType:对象属性的类型
  • column:所对应的外键字段名称
  • select:使用另一个查询封装的结果

二、一对多的表查询 (edi_test_task  和  edi_task_detail) 例子:一个任务对应多个任务明细

SQL对应的映射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.cn.mybatis.mapper.taskMapper">

     <!-- 方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 -->
    <select id="getAllTask" parameterType="String" resultType="ettask">
        select * from edi_test_task where task_id=#{taskId}
    </select>
    <resultMap type="EdiTestTask" id="ettask">
        <id property="task_id" column="task_id"/>
        <collection property="etdlist" column="task_id" javaType="EdiTaskDetail">
           <id property="detail_id" column="detail_id"/>
        </collection>
    </resultMap>
    
    
    <!-- 方式二嵌套查询:通过执行另外一个SQL映射语句来返回与其的复杂类型-->
    <select id="getTaskById" parameterType="String" resultMap="task">
        SELECT * FROM edi_test_task where task_id=#{taskId}
    </select>
    <resultMap type="EdiTestTask" id="task">
        <id property="task_id" column="task_id"/>
        <collection property="etdlist" column="task_id" select="taskDetailById"></collection>
    </resultMap>
    
    <select id="taskDetailById" parameterType="String" resultType="EdiTaskDetail">
        select * from edi_task_detail where task_id=#{taskId}
    </select>
</mapper>

总结:MyBatis中使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型。

原文地址:https://www.cnblogs.com/renxiaoren/p/5249798.html