绪论
本章接上章,本章主要讲述mybatis多表查询,用于练习一对多,多对多的复杂关系查询。
在mybatis多表查询中,一对多通过增加附加属性来实现,多对多通过在附加集合属性来存放多条数据。
目的:在三张实体表,一张关系表中查询学生的信息和其所在的班级以及所选的全部课程
一、准备
1.1 数据库建表
建了四张表:
person(学生)
class(班级)
course(课程)
per_cout_relation(学生课程主键联系表)
1.2 目录
二、 分层
2.1 model 实体类
完善代码,符合Javabean规范
Person.java
private int id;
private String name;
private String age;
private int classId;
private Class perClass;
private List<Course> courseList;
Course.java
private int courseId;
private String courseName;
Class.java
private int classId;
private String className;
2.2 Dao
PersonDao.java
查找学生信息和其所在的班级以及所选的全部课程
public interface PersonDao {
public List<Person> findPersonAndClassAndCourse();
}
PersonDao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.zk.mybatis.dao.PersonDao">
<resultMap type="Person" id="baseResult">
<id column="p_id" property="id"/>
<result column="p_name" property="name"/>
<result column="p_age" property="age"/>
<result column="class_id" property="classId"/>
<association property="perClass" javaType="Class">
<id column="c_id" property="classId"/>
<result column="c_name" property="className"/>
</association>
<collection property="courseList" ofType="Course">
<id column="course_id" property="courseId"/>
<result column="course_name" property="courseName"/>
</collection>
</resultMap>
<select id="findPersonAndClassAndCourse" resultMap="baseResult">
SELECT p.*,cla.*,cour.*
FROM person p,class cla,course cour,per_cour_relation rea
WHERE p.class_id = cla.c_id AND p.p_id = rea.per_id
and cour.course_id = rea.cour_id
</select>
</mapper>
2.3 Servlet(用于测试)
PersonServlet.java
public class PersonServlet {
private PersonService personService = new PersonServiceImpl();
@Test
public void test1() {
List<Person> list = personService.findPersonAndClassAndCourse();
for (Person person : list) {
System.out.println(person);
}
}
}
数据库查询的记录:7条
返回的结果集是person对象类型,数据库中只有四个person,