使用MyBatis进行多表联查的关键是构建数据库中表的字段和java中对象的属性的映射关系,构建映射关系的方式有两种:Mapper.xml配置文件和注解
下面以学生表和班级表来举例:
- 建立学生表和班级表:
CREATE TABLE student( sid INT PRIMARY KEY auto_increment, sname VARCHAr(20), classid INT ); CREATE TABLE class( classid INT PRIMARY KEY auto_increment, classname VARCHAr(20) );
在学生表和班级表的关系中,每个学生只能对应一个班级(一对一的关系),每个班级对应多个学生(一对多的关系)
- 构建对应的实体类:
public class Student {
private int sid;
private String sname;
private int classid;
//一个学生只属于一个班级
private Classs classs;
//无参构造、有参构造、get和set方法
}
public class Classs {
private int classid;
private String classname;
//一个班级有多个学生
private List slist;
//无参构造、有参构造、get和set方法
}
- 写主配置文件,声明Mapper配置文件所在包
- 在对应包下在接口文件中定义方法并利用xml配置文件或注解构建映射关系
- 接口文件:
public interface StudentMapper {
public List findAllStudent();
}
public interface ClassMapper {
public List findAllClass();
}
- xml配置文件:
select * from student inner join class on student.classid = class.classid
注解构建映射关系:
- 接口文件:
public interface StudentMapper {
//Results注解类似于xml文件中的resultMap标签,可以自定义映射关系
@Results({
//Result类似于xml文件中的result标签,声明映射的字段名和属性名
@Result(column ="sid",property="sid"),
@Result(column="sname" ,property="sname"),
@Result(column="classid" ,property="classid"),
//在一对一中,使用One注解将后面的映射接口文件中的方法返回的一个实体类对象(例如:一个班级对象)
//赋值给前面的属性(例如student中的classs),其中property指明要赋值的属性,column指明要传入后面方法的参数
@Result(property="classs",column = "classid",one=@One(select="com.ape.mapper.ClassMapper.findClassByClassid")),
})
@Select("select * from student")
public List findAllStudent();
@Select("select * from student where classid = #{v}")
public Student findStudentByClassid(int classid);
}
public interface ClassMapper {
@Results({
@Result(column ="classid",property="classid"),
@Result(column="classname" ,property="classname"),
//在一对多中,使用Many注解将后面接口文件中的方法以集合形式返回的多个实体类对象(一个班级中的多个学生)
//赋值给前面的集合类型的属性(例如:class中的slist)
@Result(property="slist",column = "classid",many=@Many(select = "com.ape.mapper.StudentMapper.findStudentByClassid")),
})
@Select("select * from class")
public List findAllClass();
@Select("select * from class where classid = #{v}")
public Classs findClassByClassid(int classid);
}
- 使用Mybatis获取接口的实现类对象,调用对应方法,多表联合查询学生对应的班级信息或班级中所有学生的信息



