比如:
- 一个老师拥有多个学生!
- 对于老师而言,就是一对多的关系!
环境搭建
实体类
import lombok.Data;
/**
* @Description: 类描述
* @Author: gt
* @Date: 2022/03/31 22:32
*/
@Data
public class Student {
private int id;
private String name;
private int tid;
}
import lombok.Data;
import java.util.List;
/**
* @Description: 类描述
* @Author: gt
* @Date: 2022/03/31 22:32
*/
@Data
public class Teacher {
private int id;
private String name;
private List<Student> studentList;
}
按照结果嵌套处理
<select id="getTeacher" resultMap="teacherStudent" parameterType="int">
select t.id tId,t.name tName,s.id sId,s.name sName from teacher t ,student s where t.id = s.tid and t.id=#{tId}
</select>
<resultMap id="teacherStudent" type="com.gt.pojo.Teacher">
<result property="name" column="tName"/>
<result property="id" column="tId"/>
<!--
复杂的属性,我们需要单独处理
集合:collection
javaType="" 执行属性的类型
结婚中的泛型信息,我们使用ofType获取
-->
<collection property="studentList" ofType="com.zyy.pojo.Student">
<result property="id" column="sId"/>
<result property="name" column="sName"/>
</collection>
</resultMap>
按照查询嵌套处理
<select id="getTeacher2" resultMap="teacherStudent2" parameterType="int">
select id,name from teacher where id=#{tId}
</select>
<resultMap id="teacherStudent2" type="com.gt.pojo.Teacher">
<collection property="studentList" javaType="ArrayList" ofType="com.zyy.pojo.Student" select="getStudentListByTeacherId" column="id"/>
</resultMap>
<select id="getStudentListByTeacherId" resultType="com.gt.pojo.Student" parameterType="int">
select id,name,tid from student where tid=#{tId}
</select>
小结
-
关联 - association【多对一】
-
集合 - collection【一对多】
-
javaType & ofType
- javaType 用来指定实体类中属性的类型
- ofType 用来指定映射到List或者集合中pojo类型,泛型中的约束类型。
- 多对一时,表示“多”的那一部分的实体类应使用“一”的对象来表示
- 一对多时,表示“一”的那一部分的实体类应使用“多”的List来表示
注意点
-
保证sql的可读性,尽量保证通俗易懂
-
注意一对多和多对一中,属性和字段的问题
-
如果问题不好排查错误,可以使用日志,建议使用Log4j
-
当把接口的.xml文件放在resources层时,注意要将文件夹分层
- 在 (resultMap="" )中多了空格会导致运行不成功
- 在核心配置文件中的反射路径不要配错
- 在接口.xml文件中的namespace的路径不要配错