11、一对多的处理

在学习多对一的处理时,我们是站在学生的角度(多个学生对应一个老师)看待问题,但如果站在老师角度,就应该是一对多(一个老师对应多个学习)。

Student Bean

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private int id;
    private String name;
    //学生需要关联一个老师
    private int tid;
}

Teacher Bean

@Data
public class Teacher {
    private int id;
    private String name;
    //老师包含多个学生
    private List<Student> students;
}

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.johngea.mapper.TeacherMapper">
    <select id="getTeacher" resultMap="getTeacher">
        select t.id tid,t.name tname,s.id sid,s.name sname,s.tid stid
        from teacher t, student s
        where t.id = s.tid and t.id = #{id}
    </select>
    <resultMap id="getTeacher" type="Teacher">
        <result column="tid" property="id"/>
        <result column="tname" property="name"/>
        <!--collection表示集合关系--ofType取集合的泛型类型-->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="stid"/>
        </collection>
    </resultMap>
</mapper>

这种方式和之前多对一中的按结果嵌套处理方式一样,属于联表的查询方式。

运行结果

Teacher(
	id=1, 
	name=秦老师, 
	students=[
		Student(id=1, 
			    name=小明, 
			    tid=1), 
	 	Student(id=2, 
	 	        name=小红, 
	 	        tid=1), 
	 	Student(id=3, 
	 		    name=小张, 
	 		    tid=1), 
	  	Student(id=4, 
	  		    name=小李, 
	  		    tid=1), 
	  	Student(id=5, 
	  		    name=小王, 
	  		    tid=1)]
)

当然还有嵌套查询的方式,只不过不建议使用

<select id="getTeacher2" resultMap="getTeacher2">
    select * from teacher where id = #{id}
</select>
<resultMap id="getTeacher2" type="Teacher">
    <!--嵌套的子查询语句中,返回的结果为多条数据,在Teacher类中对应的List<Student> 因此查询结果对象应该指定List类型(我自己测试如果指定了ofType可以不写javaType)-->
    <collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudentByTid"/>
</resultMap>
<select id="getStudentByTid" resultType="Student">
    select * from student where tid = #{tid}
</select>

10 - 11小结、

  • id 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能(一般用于主键

  • result 注入到字段或 JavaBean 属性的普通结果

  • association 【多对一】

    • 一个复杂类型的关联;许多结果将包装成这种类型

    • 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用

  • collection 【一对多】

    • 一个复杂类型的集合

    • 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用

      javaType	&	ofType
      
    • javaType 用来指定实体类中类型的属性;

    • ofType 用来指定映射到List或者集合中的Bean类型,或者说就是泛型的约束类型;

注意点:

  • 保证SQL的可读性,尽量保证通俗易懂;
  • 注意一对多多对一中,属性名和字段的问题;
  • 如果问题不好排查,可以使用日志,建议使用LOG4J;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值