一对多 与 一对一 查询有许多相似之处。
最主要的区别是 查询结果是list,与之对应的标签为collection.
班级和学生,一个班有多个学生,而每个学生只能属于一个班。
此时班级编号作为学生表的外码。
学生实体类:
public class Student {
private int id;
private String name;
}
这时班级类修改为:
public class Classes {
private int id;
private String name;
private Teacher teacher;
**private List<Student> list**;
}
根据班级编号,查询班级信息,以及此班所有学生的信息。
同样有两种方法:
第一种:
<select id="getClass" parameterType="int" resultMap="getClassMap">
SELECT * from class c,teacher t,student s WHERE s.class_id=c.c_id and c.c_id=#{id}
</select>
<resultMap type="Classes" id="getClassMap">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<collection property="list" ofType="Student">
<id property="id" column="s_id"/>
<result property="name" column="s_name"/>
</collection>
</resultMap>
第二种:
<select id="getClass2" resultMap="getClassMap2">
SELECT * FROM class WHERE c_id=#{id}
</select>
<select id="getStudent" resultType="Student">
SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
</select>
<resultMap type="Classes" id="getClassMap2">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<collection property="list" column="c_id" select="getStudent"></collection>
</resultMap>
测试类:
public class Test6 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SqlSessionFactory factory = MybatisUtil.getFactory();
SqlSession session = factory.openSession();
String statement="com.atguigu.mybatis.test6.classMapper.getClass";
statement="com.atguigu.mybatis.test6.classMapper.getClass2";
Classes classes = session.selectOne(statement , 1);
System.out.println(classes);
}
}
结果: