目录
一、创建两个表(一个主表,一个子表)
这里以一个班级对应多个学生为例
班级class是主表:
CREATE TABLE class(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(20),
);
INSERT INTO class(c_name, teacher_id) VALUES('class_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('class_b', 2);
学生student是子表:
CREATE TABLE student(
s_id INT PRIMARY KEY AUTO_INCREMENT,
s_name VARCHAR(20),
c_id INT #这个字段的目的是关联班级表class,该字段名最好和主表的主键字段名一致
);
INSERT INTO student(s_name, class_id) VALUES('student_A', 1);
INSERT INTO student(s_name, class_id) VALUES('student_B', 1);
INSERT INTO student(s_name, class_id) VALUES('student_C', 1);
INSERT INTO student(s_name, class_id) VALUES('student_D', 2);
INSERT INTO student(s_name, class_id) VALUES('student_E', 2);
INSERT INTO student(s_name, class_id) VALUES('student_F', 2);
注意:子表关联主表的字段 最好和主表的主键字段名一致
二、创建两个表对应的实体类
在查询主表的同时,还要查询子表的内容,那么子表的内容放在哪呢,到时就会映射到这个对象上。(不要忘记添加set和get函数)
主表对应的实体类Classes
public class Classes {
//定义实体类的属性,与class表中的字段对应
private int cid;
private String cName;
private List<Student> students;
//get和set函数
}
子表 对应的实体类Student
public class Student {
//定义属性,和student表中的字段对应
private int sid;
private String sName;
private int cid;
//get和set函数
}
三、创建ClassesMapper接口
声明一个查询接口
List<Classes> selectMultipleTables(int id);
四、创建ClassesMapper.xml来实现上述接口
<!--
property —— 实体类的属性名
column —— 属性名对应哪个字段名(这里其实就相当于给实体类的属性和表的字段建立映射关系)
association 一般用于一对一查询,collection 一般用于一对多查询
collection:
property —— 在Classes类里声明的对象名
ofType —— 对象属于哪个自定义类
-->
<resultMap type="com.example.demo.entity.Classes" id="ClassResultMap3">
<id property="cid" column="c_id"/>
<result property="cName" column="c_name"/>
<!-- ofType指定students集合中的对象类型 -->
<collection property="students" ofType="com.example.demo.entity.Student">
<id property="sid" column="s_id"/>
<result property="sName" column="s_name"/>
</collection>
</resultMap>
五、使用select标签查询
这里要和第三部分的接口声明对应起来。
id —— 接口函数名
resultMap —— 第四部分定义的一个结果集的id
#{id} —— 这里的id就是接口函数的形参
<select id="selectMultipleTables" parameterType="int" resultMap="ClassResultMap3">
select * from
class c,
student s
where
c.c_id=#{id}
and
c.C_id=s.class_id
</select>