多对一的概念在数据库中是十分常见的,下面将以多个学生对应一个老师的例子介绍4种多对一的查询方式。
一,建立数据库
首先建立2种表,一种是teacher表,其中包含的字段有id(主键),name。一种是student表,其中包含的字段有id(主键),name,tid。其中student包含一个外键fkid(student.tid=teacher.id)。建完后添加成员5个学生对应1个老师,下面是表的设计
下面是数据库种添加的成员
二,环境搭建
1,导入lombok
lombok是一款插件,能够通过注解开发,比如只要在实体类上加上@data注解就能自动生成无参构造,set,get,toString,hashCode,equals方法,直接在Maven仓库中搜索导入即可,以下是整个项目所需要的依赖
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
2,新建实体类Teacher,Student
使用注解开发所以未展示基本的方法
Teacher类
package li.pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}
Student类
package li.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
//学生需要关联一个老师
private Teacher teacher;
}
3,建立Mapper接口
StudentMapper以及TeacherMapper
4,建立Mapper.xml文件
StudentMapper.xml以及TeacherMapper.xml
5,在核心配置文件中注册绑定Mapper接口
<mappers>
<mapper class="li.dao.TeacherMapper"/>
<mapper class="li.dao.StudentMapper"/>
</mappers>
整个项目的文件结构如下
三,查询方式
1,按照查询嵌套处理
<!--
1,查询所有的学生
2,根据查询出来的学生的tid,寻找对应的老师!
-->
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"></result>
<result property="name" column="name"></result>
<!--复杂的属性,我们需要单独处理
对象:association
集合:collection
-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"></association>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id=#{tid}
</select>
这里注意返回结果不是学生所以要用resultMap.property对应实体类中的属性,colum对应表中的字段。Student中包含的Teacher属性不是基本数据类型,所以要用到association.association中又要用属性和字段对应。
2,按照结果查询嵌套处理
<!--按照结果嵌套处理-->
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid=t.id
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher" >
<result property="name" column="tname"/>
</association>
</resultMap>
这个比较容易理解,查询老师的id等于学生的tid
3,子查询
<select id="getStudent3" resultMap=StudentTeacher3>
select id,name,tid from student where tid=(select id from teacher)
</select>
4,联表查询
<select id="getStudent3" resultMap="StudentTeacher3">
select id,name,tid
from student as s
inner join tercher as t
where s.tid=t.id
</select>
查询结果