Mybatis关联查询之一对多和多对一XML配置详解

转:https://blog.csdn.net/qq_33561055/article/details/78861131

平时在开发过程中dao、bean和XML文件都是自动生成的,很少写XML的配置关系,今天记录一下mybatis的关联查询中的多对一和一对多的情况。

  • 首先是有两张表(学生表Student和老师Teacher表),为了更易懂,这里只设置了最简单的几个必要字段。表结构如下图

Student表:


Teacher表:

  • 创建实体bean
Teacher.java:
[java]  view plain  copy
  1. import java.util.List;  
  2.   
  3. /** 
  4.  * TODO 
  5.  * @version 创建时间:2017年12月21日 上午9:02:45 
  6.  */  
  7. public class Teacher {  
  8.   
  9.     private Integer id;  
  10.     private String name;  
  11.     private String className;  
  12.     private List<Student> students;  
  13.   
  14.     public List<Student> getStudents() {  
  15.         return students;  
  16.     }  
  17.   
  18.     public void setStudents(List<Student> students) {  
  19.         this.students = students;  
  20.     }  
  21.   
  22.     public Integer getId() {  
  23.         return id;  
  24.     }  
  25.   
  26.     public void setId(Integer id) {  
  27.         this.id = id;  
  28.     }  
  29.   
  30.     public String getName() {  
  31.         return name;  
  32.     }  
  33.   
  34.     public void setName(String name) {  
  35.         this.name = name;  
  36.     }  
  37.   
  38.     public String getClassName() {  
  39.         return className;  
  40.     }  
  41.   
  42.     public void setClassName(String className) {  
  43.         this.className = className;  
  44.     }  
  45.   
  46. }  

Sfudent.java

[java]  view plain  copy
  1. /** 
  2.  * TODO 
  3.  *  
  4.  * @author 作者 E-mail:[email protected] 
  5.  * @version 创建时间:2017年12月21日 上午9:01:17 
  6.  */  
  7. public class Student {  
  8.   
  9.     private Integer id;  
  10.     private String name;  
  11.     private Integer teacherId;  
  12.     private String className;  
  13.     private Teacher teacher;  
  14.       
  15.   
  16.     public Teacher getTeacher() {  
  17.         return teacher;  
  18.     }  
  19.   
  20.     public void setTeacher(Teacher teacher) {  
  21.         this.teacher = teacher;  
  22.     }  
  23.   
  24.     public Integer getId() {  
  25.         return id;  
  26.     }  
  27.   
  28.     public void setId(Integer id) {  
  29.         this.id = id;  
  30.     }  
  31.   
  32.     public String getName() {  
  33.         return name;  
  34.     }  
  35.   
  36.     public void setName(String name) {  
  37.         this.name = name;  
  38.     }  
  39.   
  40.     public Integer getTeacherId() {  
  41.         return teacherId;  
  42.     }  
  43.   
  44.     public void setTeacherId(Integer teacherId) {  
  45.         this.teacherId = teacherId;  
  46.     }  
  47.   
  48.     public String getClassName() {  
  49.         return className;  
  50.     }  
  51.   
  52.     public void setClassName(String className) {  
  53.         this.className = className;  
  54.     }  
  55.   
  56.     @Override  
  57.     public String toString() {  
  58.         return "{id:"+this.id+",name:"+this.name+",className:"+this.className+",teacherId:"+this.teacherId+"}";  
  59.     }  
  60. }   
  • 下面重点来了:配置Mapper.xml文件:
[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  3. <mapper namespace="com.tz.mybatis.dao.studentDao">    
  4.       
  5.     <!-- /////////////////////////////////一对多的第一种写法,一般考虑到性能问题,不会这么实现//////////////////////// -->  
  6.     <resultMap type="Teacher" id="teacherMap">  
  7.         <id column="id" property="id"/>  
  8.         <result column="name" property="name"/>  
  9.         <collection property="students" ofType="Student" column="id">  
  10.             <id column="sid" property="id"/><!-- 这里的column对应的是下面查询的别名,而不是表字段名 -->  
  11.             <result column="sname" property="name"/><!-- property对应JavaBean中的属性名 -->  
  12.             <result column="className" property="className"/>  
  13.         </collection>  
  14.     </resultMap>  
  15.       
  16.       
  17.     <!-- 查询所有的老师级各自的所有学生 -->  
  18.     <select id="getTeachers" parameterType="Teacher" resultMap="teacherMap">  
  19.         SELECT  
  20.             t.id,  
  21.             t.NAME,  
  22.             t.class_Name,  
  23.             s.id AS sid,  
  24.             s. NAME AS sname,  
  25.             s.class_name as className  
  26.         FROM  
  27.             teacher t  
  28.         LEFT JOIN student s ON t.id = s.teacher_id  
  29.     </select>  
  30. </mapper>  

  • 测试类:

[java]  view plain  copy
  1. package com.tz.test;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.List;  
  6. import org.apache.ibatis.io.Resources;  
  7. import org.apache.ibatis.session.SqlSession;  
  8. import org.apache.ibatis.session.SqlSessionFactory;  
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  10. import org.junit.Before;  
  11. import org.junit.Test;  
  12. import com.tz.mybatis.bean.Student;  
  13. import com.tz.mybatis.bean.Teacher;  
  14.   
  15. public class TeacherTest {  
  16.   
  17.     private SqlSessionFactory sqlSessionFactory;  
  18.       
  19.     @Before  
  20.     public void init() throws IOException {  
  21.         String resource = "mybatis-config.xml";  
  22.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  23.         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  24.     }  
  25.       
  26.     @Test  
  27.     public void getTeachers() {  
  28.         SqlSession session = sqlSessionFactory.openSession();  
  29.         List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getTeachers");  
  30.         System.out.println(list);  
  31.     }  
  32.       
  33. }  

下面给出第二种写法:

[html]  view plain  copy
  1. <!-- //////////////////////////////////////////////一对多的第二种写法///////////////////////////////////////////////////// -->  
  2.     <resultMap type="Teacher" id="teacherMaps">  
  3.         <id column="id" property="id"/>  
  4.         <result column="name" property="name"/>  
  5.         <result column="class_name" property="className"/>  
  6.         <collection property="students" ofType="Student" select="getStudents" column="id">  
  7.         </collection>  
  8.     </resultMap>  
  9.       
  10.       
  11.     <!-- 查询所有的老师级各自的所有学生 -->  
  12.     <select id="getAllTeacher" parameterType="Teacher" resultMap="teacherMaps">  
  13.         SELECT  
  14.             t.id,  
  15.             t.NAME,  
  16.             t.class_name  
  17.         FROM  
  18.             teacher t  
  19.     </select>  
  20.       
  21.     <select id="getStudents" parameterType="int" resultType="Student">  
  22.         select   
  23.             s.id,  
  24.             s. NAME,  
  25.             s.class_name as className  
  26.         from student s  
  27.         where teacher_id = #{id}  
  28.     </select>  

测试类:

[java]  view plain  copy
  1. @Test  
  2.     public void getTeachers2() {  
  3.         SqlSession session = sqlSessionFactory.openSession();  
  4.         List<Teacher> list = session.selectList("com.tz.mybatis.dao.studentDao.getAllTeacher");  
  5.         System.out.println(list);  
  6.     }  

查询学生信息(多对一):

首先还是配置文件:

[html]  view plain  copy
  1. <resultMap type="Student" id="studentMap">  
  2.         <id column="id" property="id"/>  
  3.         <result column="name" property="name"/>  
  4.         <result column="class_name" property="className"/>  
  5.         <result column="teacher_id" property="teacherId"/>  
  6.         <association property="teacher" select="getTeacher" column="teacher_id" javaType="Teacher">  
  7.         <!-- 这里要注意的是column对应的是student中的外键,而且需是表字段名 -->  
  8.         </association>  
  9.     </resultMap>  
  10.       
  11.       
  12.     <select id="getStudent" resultMap="studentMap">  
  13.         SELECT  
  14.             s.id,  
  15.             s.name,  
  16.             s.class_name,  
  17.             s.teacher_id  
  18.         FROM  
  19.             student s  
  20.     </select>  
  21.       
  22.     <select id="getTeacher" resultType="Teacher" parameterType="int">  
  23.         SELECT  
  24.             t.id,  
  25.             t.name,  
  26.             t.class_name as className   
  27.         FROM teacher t   
  28.         where id = #{teacher_id}  
  29.     </select>  

测试类:

[java]  view plain  copy
  1. @Test  
  2.     public void getStudents() {  
  3.         SqlSession session = sqlSessionFactory.openSession();  
  4.         List<Student> list = session.selectList("com.tz.mybatis.dao.studentDao.getStudent");  
  5.         System.out.println(list);  
  6.     }  

最后:当然如果不想配置这么麻烦的信息,可以直接写一个关联查询的SQL语句,返回结果直接由Map接受即可。不过这样就不太符合面向对象的理念了。

猜你喜欢

转载自blog.csdn.net/javanotes/article/details/80457093
今日推荐