9、多对一处理
举例:
【关联】多个学生关联一个老师、【多对一】
【集合】一个老师有很多个学生、【一对多】
按照查询嵌套处理
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="student">
<association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id = #{tid}
</select>
这个相当于子查询、在一个查询里面在嵌套一层查询
按照结果嵌套处理
<select id="getStudent2" resultMap="StudentTeacher2">
SELECT s.id sid,s.name sname,t.name tname
FROM `student` AS s,`teacher` AS t
WHERE s.tid = t.id
</select>
<resultMap id="StudentTeacher2" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
这种的是按照查询出来的结果对数据进行映射到实体类中
小结:
- 标签:
association
: 处理多对一的、简单理解为在复杂的属性使用、这个用于处理实体类属性为对象的属性
- 属性:
select
: 这个属性就是在执行一个select
标签、里面的值对应的是select
标签中的id
的属性值property
:实体类属性名column
: 数据库字段名、如设置别名使用别名javaType
: 这个就是对应映射属性值的类型、指定该属性的类型、用来指定实体类中的属性的类型
10、一对多处理
比如:一个老师对应多个学生
对老师而言就是一对多的关系
按照结果嵌套处理
<select id="getTeacher" resultMap="TeacherStudent">
SELECT s.id AS sid,s.name AS sname,t.name AS tname, t.id AS tid
FROM teacher AS t,student AS s
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="student" ofType="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
相当于联表查询
按照查询嵌套查询
<select id="getTeacher2" resultMap="getStudentId">
select * from teacher where id = #{tid}
</select>
<resultMap id="getStudentId" type="Teacher">
<collection property="student" javaType="ArrayList" ofType="student" select="getStudent" column="id"/>
</resultMap>
<select id="getStudent" resultType="Student">
select * from student where tid = #{id}
</select>
相当于子查询
小结:
- 标签:
collection
: 处理一对多的、简单理解为在复杂的属性使用、这个用于处理实体类属性的属性为集合的属性
- 属性:
select
: 这个属性就是在执行一个select
标签、里面的值对应的是select
标签中的id
的属性值property
:实体类属性名column
: 数据库字段名、如设置别名使用别名javaType
:用来指定实体类中的属性的类型ofType
: 是指集合中的泛型类型
多对一和一对多的总结
1、关联—— association 【多对一】
2、集合—— collection 【一对多】
3、 JavaType & ofType的区别
1、JavaType :用来指定实体类中的属性的类型
2、ofType : 用来指定集合中的泛型类型