9. 一对多处理
一对多的理解:
- 一个老师拥有多个学生
- 如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)!
9.1 搭建环境
-
建立以下环境:
-
编写pojo包下的实体类
public class Teacher { private Integer id; private String name; private List<Student> students; //构造器和get,set方法 } public class Student implements Serializable { private Integer id; private String name; private Integer tid; //构造器和get,set方法 }
-
编写dao包下的接口和xml文件
//获取一个老师所有的学生 List<Teacher> getTeachers();
-
xml第一种实现方式:嵌套查询的方式
<select id="getTeachers" resultMap="teacherStudent"> select * from teacher; </select> <resultMap id="teacherStudent" type="teacher"> <collection property="students" javaType="ArrayList" ofType="student" column="id" select="getStudent"/> </resultMap> <select id="getStudent" resultType="student"> select * from student where tid=#{id}; </select>
-
xml第二种实现方式:联表查询的方式
<select id="getTeachers" resultMap="teacherStudent"> SELECT t.id tid,t.`name` tname,s.id sid,s.`name` sname,s.tid stid FROM teacher t INNER JOIN student s ON t.id=s.tid; </select> <resultMap id="teacherStudent" type="teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <collection property="students" javaType="ArrayList" ofType="student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="stid"/> </collection> </resultMap>
-
-
测试:
@Test public void testGetTeachers(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); List<Teacher> teachers = mapper.getTeachers(); for (Teacher teacher : teachers) { System.out.println(teacher); } sqlSession.close(); }
-
结果
9.2 总结
- 关联-association
- 集合-collection
- 所以association是用于一对一和多对一,而collection是用于一对多的关系
- JavaType和ofType都是用来指定对象类型的
- JavaType是用来指定pojo中属性的类型
- ofType指定的是映射到list集合属性中pojo的类型
注意说明:
- 保证SQL的可读性,尽量通俗易懂
- 根据实际要求,尽量编写性能更高的SQL语句
- 注意属性名和字段不一致的问题
- 注意一对多和多对一 中:字段和属性对应的问题
- 尽量使用Log4j,通过日志来查看自己的错误