首先。我们需要知道,表与表之间存在的几种关系:
一对一
一对多(多对一)
多对多
一对多:
举例:班级与学生:
class表:
CREATE TABLE `class` (
`id` int NOT NULL,
`classid` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
students表:
CREATE TABLE `students` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`classId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `classId` (`classId`),
CONSTRAINT `students_ibfk_1` FOREIGN KEY (`classId`) REFERENCES `class` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
建立两个实体类:
- 1.如果通过班级id查询该班学生情况。即通过class表查询students表,需要在class表对应的实体类中建立关联属性。即是将查询的结果全部映射在classs类
- 2.如何想将查询后的结果映射到student属性,则需要在student类中设置关联属性
- 3.下面的示例是将查询结果映射进classs对象中,关联属性设置在classs类中:
classs表:
public class classs {
private int id;
private String classid;
//设置关联属性,由于class表与students表是一对多关系。该属性设置为集合类型
private Set<Students> st;
public classs() {
}
public classs(String classid) {
this.classid = classid;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getClassid() {
return classid;
}
public void setClassid(String classid) {
this.classid = classid;
}
public Set<Students> getSt() {
return st;
}
public void setSt(Set<Students> st) {
this.st = st;
}
@Override
public String toString() {
return "classs{" +
"id=" + id +
", classid='" + classid + '\'' +
", st=" + st +
'}';
}
}
students表:
package org.example.pojo;
public class Students {
private int id;
private String name;
public Students() {
}
public Students(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Students{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
在dao层的接口中
Classs selectByStudentId(int id);
对于多表查询,有两种查询方式:
- 多变连接查询
- 多表单独查询
多表单独查询
<select id="selectByStudentId" resultMap="selectBystudents">
select id,classid from class where id=#{ha}
</select>
//通过id查询class表的相关属性,将结果封装到resultMap中
<resultMap id="selectBystudents" type="org.example.pojo.classs">
<id property="id" column="id"/>
<result property="classid" column="classid"/>
<collection property="st" column="id" ofType="Students" select="selectbyst"/>
</resultMap>
//对resultMap中的字段进行手动映射
<select id="selectbyst" resultType="org.example.pojo.Students">
select id,name from students where classId=#{id}
</select>
//将class表返回的id传到students表中查询相关属性
多表连接查询
<select id="selectByStudentId" resultMap="classMap">
select class.id As cId,classid,studnet.id As sId,name,from class left join on studnet.cid=class.id where student.id=#{ha}
</select>
<resultMap id="classMap" type="org.example.pojo.classs">
<id property="id" column="cId"/>
<result property="classid" column="classid"/>
<collection property="st" ofType="Students">
<id property="id" column="sId"/>
<result property="name" column="sname"/>
</collection>
</resultMap>
type:对应的实体类
id:针对主键
result:普通属性
collection:关联属性
property:对应的实体类中的属性名
colum:数据库表中的列名
OfType:关联属性的的数据类型。如果是集合,应写集合内元素的类型。
总结:
- 对于多表查询,
关联属性
决定着 查询结果 映射在哪个对象中 - 多表查询连接查询相比多表单独查询,过程比较简单,但是比较消耗内存。所以还是推荐多表单独查询。