一、一对一的表关联查询(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属性指定集合中元素的对象类型。