MyBatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别。

MyBatis关系映射一对一一对多浏览:1087收藏:0
答案:
selectOne
一对一:association
<!--   
     4、关联表查询:一对一关联  
     如何根据id查询班级信息(包括老师信息)  
     Class封装了Teacher属性,即是相互关联的  
  -->  
 <!--定义操作 users 表的sql 映射文件:orderMapper.xml   -->  
 <mapper namespace="com.mybatis.test4.classesMapper">  
     <!--  
         方式一:嵌套结果  
         使用嵌套结果映射来处理重复的联合结果的子集来封装联表查询的数据(去除重复的数据)  
     -->  
             <select id="getClassInfo" parameterType="int" resultMap="ClassResultMap">  
                 select * from class c,teacher t where c.teacher_id = t.t_id and c.c_id = #{id}  
             </select>  
             <!-- 解决字段名属性名不一致问题 -->  
             <resultMap type="Classes" id="ClassResultMap">  
                 <id property="id" column="c_id"/>  
                 <result property="name" column="c_name"/>  
                 <!-- 一对一关联查询 -->  
                 <association property="teacher" column="teacher_id" javaType="Teacher">  
                     <id property="id" column="t_id"/>  
                     <result property="name" column="t_name"/>  
                 </association>  
             </resultMap>  
       
     <!--  
         方式二:嵌套查询  
         通过执行另外一个SQL映射语句来返回预期的复杂类型:  
         SELECT * FROM class WHERE c_id =1;  
         SELECT * FROM teacher WHERE t_id =1;//1 是上一个查询得到的teacher_id的值  
     -->  
     <select id="getClassInfo2" parameterType="int" resultMap="ClassResultMap2" >  
         select * from class where c_id = #{id}  
     </select>  
       
     <!-- 解决字段名属性名不一致问题 -->  
     <resultMap type="Classes" id="ClassResultMap2">  
         <id property="id" column="c_id"/>  
         <result property="name" column="c_name"/>  
         <association property="teacher" column="teacher_id"   
                     javaType="Teacher" select="getTeacher">  
         </association>  
     </resultMap>  
       
     <select id="getTeacher" parameterType="int" resultType="Teacher">  
         select t_id id,t_name name from teacher where t_id=#{id}  
     </select>  
       
 </mapper>  


一对多:collection
<?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">  
 <!--   
     4、关联表查询:一对多关联  
     如何根据class_id查询班级信息(包括老师和学生信息),学生信息为集合List  
     Class封装了Teacher和学生属性,即一张class表中包含teacher表和student表  
  -->  
 <!--定义操作 classes 表的sql 映射文件:classesMapper.xml   -->  
 <mapper namespace="com.mybatis.test5.classesMapper2">  
     <!--   
         方式一:嵌套结果  
         使用嵌套结果映射来处理重复的联合结果的子集  
         SELECT * FROM class c, teacher t,student s   
         WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=1  
     -->  
     <select id="getClassInfo3" parameterType="int"  
             resultMap="getClassMap">  
             SELECT * FROM class c, teacher t,student s   
             WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND  c.c_id=#{id}  
     </select>  
     <!-- 解决字段名和属性不一致冲突 -->  
     <resultMap type="Classes" id="getClassMap">  
         <id property="id" column="c_id"/>  
         <result property="name" column="c_name"/>  
           
             <!-- 关联的教师信息 -->  
         <association property="teacher" column="teacher_id"   
                      javaType="Teacher">  
             <id property="id" column="t_id"/>  
             <result property="name" column="t_name"/>  
         </association>  
             <!-- 关联的学生信息,是集合 -->  
         <collection property="students"   
                     ofType="Student">  
             <id property="id" column="s_id"/>  
             <result property="name" column="s_name"/>   
         </collection>  
     </resultMap>  
       
     <!--   
         方式二:嵌套查询  
         通过执行另外一个SQL映射语句来返回预期的复杂类型  
         SELECT * FROM class WHERE c_id =1 //查询后获取到teacher_id,c_id值,传入下两条语句  
         SELECT * FROM teacher WHERE t_id =1   //t_id=1 是上条查询得到的teacher_id值  
         SELECT * FROM student WHERE class_id =1   //c_id = 1 是上条查询得到的c_id值  
     -->  
     <select id="getClassInfo4" parameterType="int"  resultMap="getClassMap2">  
             SELECT * FROM class WHERE c_id =#{id}     
     </select>  
           
         <resultMap type="Classes" id="getClassMap2">  
             <id property="id" column="c_id"/>  
             <result property="name" column="c_name"/>  
             <association property="teacher" column="teacher_id" javaType="Teacher"  
                         select="getTeacher"></association>  
             <collection property="students" column="c_id" ofType="Student"  
                         select="getStudent"></collection>  
         </resultMap>  
       
     <select id="getTeacher"  resultType="Teacher">  
             SELECT t_id id,t_name name FROM teacher WHERE t_id =#{id}  
     </select>  
       
     <select id="getStudent"  resultType="Student">  
             SELECT s_id id,s_name name FROM student WHERE class_id =#{id}                                                                                     
     </select>  
 </mapper>