MyBatis - 基础学习7 - 多表查询
一.按照查询嵌套处理
1.写接口
List<Student> getstudent();
2.在mapper.xml中写相关的sql语句
@Data public class Teacher { private int id; private String name; private List<Student> student; }
@Data public class Student { private int id; private String name; private int tid; }
<!-- 思路: 1.查询所有的学生信息 2.根据查询出来的学生的tid,寻找对应的老师 --> <select id="getstudent" resultMap="StudentTeacher"> SELECT * FROM student </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <!--复杂的属性单独处理: 对象:association 集合:collection --> <association property="teacher" column="tid" javaType="Teacher" select="getteacher"/> </resultMap> <select id="getteacher" resultType="Teacher"> SELECT * from teacher where id = #{tid} </select>
多对一:
多个学生对应一个老师,所以查询的思路是要把学生全部查出来去找对应的老师
由于这是不同的表查询,所以在返回值上:就不能简单的返回实体类(student,teacher是两个实体类,不能一下返回),我们就需要用到结果集映射resultMap
由于是多对一;返回值类型依旧是学生(student),普通的字段就是一一对应映射,但是对于要找的老师来说,在不同表中,这是一个对象,所以需要另外的关键字:association,专门负责对象映射
property:实体类中的属性 column:数据库中的字段 javaType:实体类中的属性在那个表中,就写它对饮的实体类 select:(子查询)这个查询的结果要有与column(数据库字段)对应的字段,他们才可以联系起来,这里是(student中的tid = teacher中的id)
子查询负责和column进行对应就好了,其中:id=#{ tid } 这个id(teacher表中的)会自动去匹配上面的column:tid(student表中的)
3.测试:
@Test public void test1(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> getstudent = mapper.getstudent(); for (Student student : getstudent) { System.out.println(student); } sqlSession.close(); }
二.按照结果嵌套处理
1.先写对应的接口
List<Student> getstudent();
2.在mapper.xml中写对应的方法
<!--按照结果嵌套处理--> <select id="getstudent" resultMap="studentteacher"> SELECT s.id sid,s.name sam,t.name tam from student s,teacher t WHERE s.tid=t.id </select> <resultMap id="studentteacher" type="Student"> <result property="id" column="sid"/> <result property="name" column="sam"/> <association property="teacher" javaType="Teacher"> <result property="name" column="tam"/> </association> </resultMap>
这种写法的解题思路就是sql语句的查询方式
语句其实没什么大问题,因为就是淳朴的sql语句,直接写里面就行了,问题在于mybayis的返回值又是两个表中的字段;所以又要用到结果集映射
前面的步骤都是一样的;property对应student实体类中的属性 column对应数据库中的字段
在使用association property:student实体类中的字段 javaType:就是property的返回值是那个表里面的,然后还要在里面写:javaType对应的实体类:中的属性要和数据库的字段对应(由于取了别名,所以用:tam)
3.测试
@Test public void test1(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> getstudent = mapper.getstudent(); for (Student student : getstudent) { System.out.println(student); } sqlSession.close(); }
====一对多(集合)=====
一.按照结果嵌套处理
1.编写接口
List<Teacher> getstudent();
2.在对应的mapper.xml中写sql语句
<select id="getstudent" resultMap="Teacher1"> SELECT s.id sid,s.name sam,t.name tam FROM student s,teacher t where s.tid=t.id </select> <!-- javaType=“” 指定属性的类型 集合中的泛型信息用ofType --> <resultMap id="Teacher1" type="Teacher"> <collection property="student" ofType="Student"> <result property="id" column="sid"/> <result property="name" column="sam"/> </collection> </resultMap>
这里的一对多和多对一都是一个概念,只不过是结果集映射不同
对象:association
集合:collection
3.测试
@Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); List<Teacher> getstudent = mapper.getstudent(); for (Teacher teacher : getstudent) { System.out.println(teacher); } sqlSession.close(); }
二.按照查询嵌套处理
1.编写接口
List<Teacher> getstudent();
2.在mapper中写sql
<select id="getstudent" resultMap="Teacher1"> SELECT * FROM teacher </select> <!-- javaType=“” 指定属性的类型 集合中的泛型信息用ofType --> <resultMap id="Teacher1" type="Teacher"> <collection property="student" javaType="ArrayList" ofType="Student" column="id" select="sell"> </collection> </resultMap> <select id="sell" resultType="Student"> SELECT * from student where tid =#{id} </select>
子查询相对来说没有直接将其它表的字段和java类中的属性对应,我们就需要加上javaType,来告诉编译器,也就是property的类型,在Teacher这个实体类定义了是List,也就是数组(最准确是一个集合),
column就是子查询语句要和主查询产生关联的一个字段(它们都是Student类中的)
3.测试
@Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); List<Teacher> getstudent = mapper.getstudent(); for (Teacher teacher : getstudent) { System.out.println(teacher); } sqlSession.close(); }