文章目录
补充
collection: 一个复杂类型的集合;在这个Teacher中有List< Student>,因为一个老师对应着多个学生。所以在回填结果的时候,我们需要使用collection进行回填List< Student>。
一、环境搭建
1. 数据库搭建
Student:
Teacher:
2. 实体类的创建:
Student:
package stdpei.pojo;
import lombok.Data;
/**
* @author huxuehao
* @create 2021-06-20-6:46
*/
@Data
public class Student {
private int id;
private String name;
private int tid;
}
Teacher:
package stdpei.pojo;
import lombok.Data;
import java.util.List;
/**
* @author huxuehao
* @create 2021-06-20-6:45
*/
@Data
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
3. xxxMapper的搭建
TeacherMapper:
public interface TeacherMapper {
Teacher getTeacherById(@Param("tid") int id);
Teacher getTeacherById2(@Param("tid") int id);
}
4.注册Mapper
mybatis-config.xml:
<!--注册mapper-->
<mappers>
<mapper class="stdpei.dao.TeacherMapper"/>
<mapper class="stdpei.dao.StudentMapper"/>
</mappers>
二、通过【结果集嵌套】的方式解决
1.查询结果要与实体类相对应
首先我们需要明白,我们的查询结果最后是要回填到对应的实体类(Teacher)中去的。所以,查询的东西应该与实体类中相对应。
注意:在Teacher中的内容包括四个(tid、tname、sid、sname)
所以在查询的时候,我们也需要查询上述的四条信息,如下:
2.查询结果的回填要准确
很明显,最后的查询结果是要回填到Teacher中,但是在Teacher中有集合类型的属性,我们需要使用“collection”标签做映射。
在实现连(多)表查询(一对多)【点击查询】中已经有详细的介绍了,在这里就不过多赘述
3.代码及测试
代码:StudentMapper.xml
<mapper namespace="stdpei.dao.TeacherMapper">
<select id="getTeacherById" resultMap="TeacherStudent">
select t.id tid, t.name tname, s.id sid, s.name sname
from `student` s,`teacher` t
where s.tid = t.id and t.id = #{tid}
</select>
<resultMap id="TeacherStudent" type="stdpei.pojo.Teacher">
<result property="id" column="tid" />
<result property="name" column="tname"/>
<collection property="students" javaType="List" ofType="stdpei.pojo.Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
</mapper>
测试:
@Test
public void getTeacherById(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacherById(1);
System.out.println(teacher);
sqlSession.close();
}
三、通过【查询嵌套】的方式解决
1.查询原理
这个方法上一个方法的不同点在于将,这个方法需要多条查询语句。
"第二条语句"借助"第一条语句的部分查询结果"进行再查询,将两条语句的查询结果回填到实体类中
2.主要事项
3.代码及测试
代码:StudentMapper.xml
<mapper namespace="stdpei.dao.TeacherMapper">
<select id="getTeacherById2" resultMap="TeacherStudent2">
select id tid, `name` tname from `teacher` where id=#{tid}
</select>
<resultMap id="TeacherStudent2" type="stdpei.pojo.Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" javaType="List" ofType="stdpei.pojo.Student" select="getStudents" column="tid"/>
</resultMap>
<select id="getStudents" resultType="stdpei.pojo.Student">
select * from `student` where tid = #{tid}
</select>
</mapper>
测试:
@Test
public void getTeacherById2(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacherById2(1);
System.out.println(teacher);
sqlSession.close();
}