十一、一对多处理
比如:一个老师拥有多个学生
对于老师而言,就是一对多的关系。
1. 环境搭建
和之前的一样,将之前的copy过来,然后把实体类进行修改
@Data public class Student { private int id; private String name; private int tid; }
@Data public class Teacher { private int id; private String name; //一个老师拥有多个学生 private List<Student> students; }
接口中进行方法编写
public interface TeacherMapper { //获取所有老师 //List<Teacher> getTeacher(); //获取指定老师下的所有学生及老师的信息 Teacher getTeacher(@Param("tid") int id); Teacher getTeacher2(@Param("tid") int id); }
2. 按照结果嵌套处理
<select id="getTeacher" resultMap="TeacherStudent"> select s.id sid, s.name sname,t.name tname,t.id tid from student s,teacher t where t.id = s.tid and t.id = #{tid}; </select> <!--按结果嵌套查询--> <resultMap id="TeacherStudent" type="Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <!--复杂的属性,我们需要单独处理. 对象:association 集合:collection --> <!--javaType=""指定属性的类型! 集合中的泛型信息,我们使用ofType获取 --> <collection property="students" ofType="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap>
3. 按照查询嵌套处理
<select id="getTeacher2" resultMap="TeacherStudent2"> select * from teacher where id = #{tid} </select> <resultMap id="TeacherStudent2" type="Teacher"> <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/> </resultMap> <select id="getStudentByTeacherId" resultType="Student"> select * from student where tid = #{tid} </select>
小结
- 关联-association【多对一】
- 集合-collection【一对多】
- javaType & ofType
- javaType用来指定实体类中属性的类型
- ofType用来指定映射到List或者集合张的pojo类型,泛型中的约束类型
注意点:
- 保证sql的可读性,尽量保证通俗易懂
- 注意一对多和多对一中,属性名和字段的问题
- 如果问题不好排查错误,可以使用日志,建议使用Log4j
结果映射:结果映射
面试高频
M y S Q L 引 擎 ; I n n o D B 底 层 原 理 ; 索 引 ; 索 引 优 化 。