mybatis-复杂查询(一对多,多对一)
一、多对一(例如多个学生对应一个老师)
1、学生实体

package com.me.domain; import lombok.Data; @Data public class Student { private int id; private String name; private Teacher teacher; }
2、老师实体

package com.me.domain; import lombok.Data; @Data public class Teacher { private int id; private String name; }
方法一:按查询嵌套处理
1、 StudentMapper-getStudentList:

<select id="getStudentList" resultMap="studentTea"> select * from student </select> <resultMap id="studentTea" type="com.me.domain.Student"> <result property="id" column="id"/> <result property="name" column="name"/> <association property="teacher" column="tid" javaType="com.me.domain.Teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="com.me.domain.Teacher"> select * from teacher where id = #{tid} </select>
2、测试

@org.junit.Test public void getStudentList(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> studentList = mapper.getStudentList(); for (Student student : studentList) { System.out.println(student.toString()); } sqlSession.close(); }
3、结果
方法二、案结果嵌套处理(联表查询)
1、 StudentMapper-getStudentList2:

<select id="getStudentList2" resultMap="studentTea2"> select s.id sid ,s.name sname ,t.id tid ,t.name tname from student s,teacher t where s.tid = t.id </select> <resultMap id="studentTea2" type="com.me.domain.Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="com.me.domain.Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> </association> </resultMap>
2、测试

@org.junit.Test public void getStudentList2(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> studentList = mapper.getStudentList2(); for (Student student : studentList) { System.out.println(student.toString()); } sqlSession.close(); }
3、结果
二、一对多(一个老师有多个学生)
1、学生实体

package com.me.domain; import lombok.Data; @Data public class Student2 { private int id; private String name; private int tid; }
2、老师实体

package com.me.domain; import lombok.Data; import java.util.List; @Data public class Teacher2 { private int id; private String name; private List<Student2> students; }
方法一:按查询嵌套处理
1、 TeacherMapper-getTeacher2:

<select id="getTeacher2" resultMap="teacherStu2"> select * from teacher where id = #{id} </select> <resultMap id="teacherStu2" type="com.me.domain.Teacher2" > <result property="id" column="id"/> <result property="name" column="name"/> <collection property="students" javaType="ArrayList" ofType="com.me.domain.Student2" select="getStudentByTid" column="id"/> </resultMap> <select id="getStudentByTid" resultType="com.me.domain.Student2"> select * from student where tid = #{id} </select>
2、测试

@org.junit.Test public void getTeacher2(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); Teacher2 teacher = mapper.getTeacher2(1); System.out.println(teacher.toString()); sqlSession.close(); }
3、结果
方法二、案结果嵌套处理(联表查询)
1、 TeacherMapper-getTeacher:

<select id="getTeacher" resultMap="teacherStu"> select s.id sid ,s.name sname ,t.id tid ,t.name tname from student s, teacher t where s.tid = t.id and t.id =#{id} </select> <resultMap id="teacherStu" type="com.me.domain.Teacher2"> <result property="id" column="tid"/> <result property="name" column="tname"/> <collection property="students" ofType="com.me.domain.Student2"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap>
2、测试

@org.junit.Test public void getTeacher(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); Teacher2 teacher = mapper.getTeacher(1); System.out.println(teacher.toString()); sqlSession.close(); }
3、结果
三、小结
1、集合--collection【一对多】
2、关联--association【多对一】
3、javaType:用来指定实体类中属性的类型
4、ofType:用来指定映射到List或集合中的实体类型,泛型中的约束类型。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步