Mybatis多表查询--多对多操作(选课示例)
程序员文章站
2022-07-12 23:20:46
...
需求描述
Mybatis是一个优秀的持久层框架,利用Mybatis可以实现对数据库的多表查询操作,假设有两个实体类,分别是学生实体类和课程实体类,它们之间是多对多的关系,即一个学生可以选多门课程,而一门课程可以被多个学生选择。属性如下:
学生表
字段属性 | 类型 | 备注 |
---|---|---|
studentId | int | 学生ID,主键 |
studentName | varchar | 学生姓名 |
studentAge | int | 学生年龄 |
课程表
字段属性 | 类型 | 备注 |
---|---|---|
courseId | int | 课程ID,主键 |
courseName | varchar | 课程名称 |
中间表
字段属性 | 类型 | 备注 |
---|---|---|
sid | int | 学生ID |
cid | int | 课程ID |
其中主键为(学生ID+课程ID),它们又分别是外键。
数据库信息
要求一:查询所有的学生信息以及各自的选修课程
student实体类
private int studentId;
private String studentName;
private int studentAge;
private List<Course>list;
studentDao接口
/**
* 查询所有的学生信息,并且加上所选的课程
*/
public List<Student> findAll();
XML文件
<resultMap id="studentMap" type="student">
<id column="studentId" property="studentId"></id>
<result property="studentName" column="studentName"></result>
<result property="studentAge" column="studentAge"></result>
<collection property="list" ofType="course">
<id column="courseId" property="courseId"></id>
<result property="courseName" column="courseName"></result>
</collection>
</resultMap>
<select id="findAll" resultMap="studentMap">
select * from student left outer join sc on student.studentId=sc.sid left outer join course on course.courseId=sc.cid;
</select>
测试类
@Test
public void findAll(){
List<Student> list=studentDao.findAll();
for(Student student:list){
System.out.println(student);
}
}
结果
要求二:查询所有的课程信息以及所对应所有的选修信息
course实体类
private int courseId;
private List<Student> list;
private String courseName;
courseDao接口
/**
* 查询所有的课程以及对应的选修学生信息
* @return
*/
public List<Course> findAll();
XML文件
<select id="findAll" resultMap="courseMap">
select * from course left outer join sc on course.courseId=sc.cid left outer join student on student.studentId=sc.sid;
</select>
<resultMap id="courseMap" type="course">
<id column="courseId" property="courseId"></id>
<result property="courseName" column="courseName"></result>
<collection property="list" ofType="student">
<id column="studentId" property="studentId"></id>
<result property="studentName" column="studentName"></result>
<result property="studentAge" column="studentAge"></result>
</collection>
</resultMap>
测试类
@Test
public void findAll(){
List<Course> list=courseDao.findAll();
for(Course course:list){
System.out.println(course);
}
}
结果
本博客纯属个人学习笔记,如有错误,感激指正
上一篇: Netty源码分析之Server bindAsync
下一篇: Jackson学习实例