Mybatis中xml配置一对多
1. 两个表格
-
student表
id name teache_id calss_name 1 盖伦 1 java 2 亚瑟 1 java 3 亚索 1 java 4 后裔 2 python 5 李白 2 python 6 韩信 2 python -
teacher表
id name class_name 1 张老师 java 2 李老师 python
2. Teacher.java
public class Teacher {
private long id;
private String name;
private String className;
private List<Student> students;
}
3. TeacherMapper.java接口
public interface TeacherMapper {
List<Teacher> findAll( );
Teacher findById (Long id);
}
4. teacherMapper.xml
<?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">
<mapper namespace="cn.liyang.springredis.mapper.TeacherMapper">
<resultMap type="cn.liyang.springredis.pojo.Teacher" id="teacherMaps">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="class_name" property="className"/>
<collection property="students" ofType="Student" select="getStudents" column="id">
<!-- column="id"这个id要传给getStudents的查询语句作为where的参数 -->
</collection>
</resultMap>
<!-- 查询所有的老师以及每个老师所拥有的学生 resultMap="teacherMaps"这是这个查询语句的返回值类型 -->
<select id="findAll" parameterType="cn.liyang.springredis.pojo.Teacher" resultMap="teacherMaps">
SELECT
t.id,
t.NAME,
t.class_name
FROM
teacher t
</select>
<!--查询一个老师-->
<select id="findById" parameterType="Long" resultMap="teacherMaps">
SELECT
t.id,
t.NAME,
t.class_name
FROM
teacher t
where
t.id = #{id}
</select>
<!--老师中有个属性students的list集合 这个集合需要用这个语句查询 入参是老师的id-->
<select id="getStudents" parameterType="int" resultType="cn.liyang.springredis.pojo.Student">
select
s.id,
s. NAME,
s.class_name as className
from student s
<!-- #{id}他的取值是 <collection property="students" ofType="Student" select="getStudents" column="id">中的column="id"-->
where teacher_id = #{id}
</select>
</mapper>
或者
<resultMap id="teacherMaps" type="cn.liyang.springredis.pojo.Teacher">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="class_name" property="className"/>
<collection property="students" column="id" select="getStudents"></collection>
</resultMap>
<select id="findById" parameterType="java.lang.Long" resultMap="teacherMaps">
select * from company.teacher where id = #{id}
</select>
<select id="findAll" resultMap="teacherMaps">
select * from company.teacher
</select>
<select id="getStudents" parameterType="java.lang.Long" resultType="cn.liyang.springredis.pojo.Student">
select * from company.student where teacher_id = #{id}
</select>
总结:
- teacher表和Teacher实体类不能相互对应上,因为实体类中有一个学生集合的属性
- 需要在mepper.xml中配置这个集合
- 在 resultMap="teacherMaps"中配置集合如何获取
- 调用select="getStudents"这个查询语句,把老师的id作为查询的条件,查询结果放进list集合