实体与实体之间的关系分为多对一、一对多和多对多。
学生和班级是典型的多对一关系。
多对一在二维表中的实现是在“多"的方建一列,其值是引用”一“的方的主键值:
而在面向对象概念,中是在多的方类中建一的方的类型的属性。
public class Student {
private int id;
private String name;
private String gender;
private int age;
private BanJi bj;
//省略其他get、set
public BanJi getBj() {
return bj;
}
public void setBj(BanJi bj) {
this.bj = bj;
}
}
public class BanJi {
private int id;
private String name;
}
MyBatis对多对一提供了两种解决方案,一种是使用ResultMap,一种是使用符合面向对象的列别名实现自动填充:
StudentDao.java:
public interface StudentDao {
//只查询学生
List<Student> searchAll();
//查询出学生和对应的班级,使用ResultMap
List<Student> searchAll2();
//使用符合面向对象的列别名实现自动填充
List<Student> searchAll3();
}
StudentDao.xml:
<select id="searchAll" resultType="entity.Student">
select * from student
</select>
<select id="searchAll2" resultMap="stuAndBj">
select s.*,bj.name as bj_name from student as s left join banji as bj on s.bj_id=bj.id
</select>
<resultMap id="stuAndBj" type="entity.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="gender" property="gender"/>
<result column="age" property="age"/>
<association property="bj" column="bj_id" javaType="entity.BanJi">
<id column="bj_id" property="id"/>
<result column="bj_name" property="name"/>
</association>
</resultMap>
<select id="searchAll3" resultType="entity.Student">
select s.*,bj.id as 'bj.id',bj.name as 'bj.name' from student as s left join banji as bj on s.bj_id=bj.id
</select>
测试类:
public class TestMany {
public static void main(String[] args) {
SqlSession session = MybatisSqlSession.getSqlSession();
StudentDao stuDao = session.getMapper(StudentDao.class);
//List<Student> list = stuDao.searchAll2();
List<Student> list = stuDao.searchAll3();
for(Student stu:list){
System.out.println(stu.getName()+" "+stu.getBj().getId()+" "+stu.getBj().getName());
}
}
}