目录
多表关联关系的分类
mybatis中的多表查询:
数据库准备
项目目录
一对一查询(多对一)
方式一:(xml文件映射)
查询结果:
方式二:(注解映射)
一对多查询(一对多)
方式一:(xml文件映射)
方式二:(注解映射)
多表关联关系的分类
既然数据库是存储项目中的数据的,项目中的数据主要是类型创建的对象,项目中类型和类型之间是有关系的,数据库中怎么体现出来?
不论是生活中,还是抽象出来的软件中,描述生活中的多个类型之间的关系,总结如下:
- 一对一关系
- 一对多关系、多对一关系
- 多对多关系
举例:
学生和成绩就是一对多 成绩和学生就是一对一
一个学生可以有多个成绩 多个成绩属于同一个学生
人和身份证号就是一对一
一个人只能有一个身份证号 一个身份证号只能属于一个人
老师和学生之间就是多对多
一个学生可以被多个老师教过 一个老师可以交多个学生
特例:
一个学生,他都只能有一个班级。
所以Mybatis就把多对一(多个学生对一个班级)看成了一对一。
mybatis中的多表查询:
示例:学生和班级
一个班级可以有多个学生
一个学生只能属于一个班级(多个学生也可以属于同一个班级)
步骤:
1、建立两张表:学生表,班级表
让学生表和班级表之间具备一对多的关系:需要使用外键在学生表中添加
2、建立两个实体类:学生实体类和班级实体类
让学生和班级的实体类能体现出来一对多的关系
3、建立两个配置文件
学生的配置文件
班级的配置文件
4、实现配置:
当我们查询学生时,可以同时得到学生所对应的班级信息
当我们查询班级时,可以同时得到班级的所属学生信息
数据库准备
student(学生表)
class(班级表)
项目目录
实体类(有参无参getset方法以及tostring)
项目目录
一对一查询(多对一)
需求:
查询所有学生,同时还要获取当前学生的所属班级信息。
注意:
因为一个学生信息只能提供一个班级,所以从查询学生信息出发关联查询班级信息为一对一查询。如果从班级信息出发查询每个班级下的学生信息则为一对多查询,因为一个班级可以有多个学生。
方式一:(xml文件映射)
创建StudengMapper接口
对应的xml映射文件
注意:接口名与xml映射文件名一致
多对一/一对一使用<association>标签
在编写Sql语句注意:
实现查询学生信息时,也要查询学生所对应的班级信息。
select * from student inner join class on student.classid=class.classid
查询结果:
方式二:(注解映射)
创建studentMapper接口 与对应ClassMapper所对应的方法
public interface StudentMapper {
//多对一/一对一映射 @One(Select="能得到属性对象的反射字符串 包.类.方法名",fetchType)
//联查两表 要有跟那个表对应的属性 classid去映射Class表的单查
@Results({
@Result(column = "classid",property ="classid" ),
@Result(column = "classid",property = "bj",
one = @One(select = "com.ape.mapper.ClassMapper.findClassByclassid"))
})
@Select("select * from student")
public List<Student> findAllStudent();
@Select("select * from student where classid=#{classid}")
public Student findStudentByClassid(int classid);
}
public interface ClassMapper {
@Select("select * from Class where classid=#{classid}")
public Class findClassByclassid(int classid);
}
注意:
@Results只修饰下面所遇见的第一个方法,别的方法需要映射需要@ResultMap(id="")去调用
查询结果:
一对多查询(一对多)
需求:
查询所有班级,同时还要获取当前班级的所属学生信息。
注意:
班级信息和他的学生信息为一对多关系,并且查询过程中如果班级没有学生信息,此时也要将学生信息查询出来,我们想到了左外连接查询比较合适。
实体类注意:
班级里有多个学生对应需要有学生集合的属性。
方式一:(xml文件映射)
创建ClassMapper接口
package com.ape.mapper;
import java.util.List;
import com.ape.bean.Class;
public interface ClassMapper {
public List<Class> findAllClass();
}
同名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.ape.mapper.ClassMapper">
<resultMap type="Class" id="Class_Stu_Map">
<result column="classid" property="classid"/>
<result column="classname" property="classname"/>
<collection property="slist" ofType="Student">
<result column="sid" property="sid"/>
<result column="sname" property="sname"/>
<result column="birthday" property="birthday"/>
<result column="ssex" property="ssex"/>
<result column="classid" property="classid"/>
</collection>
</resultMap>
<select id="findAllClass" resultMap="Class_Stu_Map">
select * from class left join student on student.classid=class.classid
</select>
</mapper>
注意:接口名与xml映射文件名一致
一对多/多对多使用<collection>标签
在编写Sql语句注意:
实现查询班级信息时,也要查询班级所对应的学生信息。
select * from class left join student on student.classid=class.classid
查询结果:
方式二:(注解映射)
创建ClassMapper接口 与对应StudentMapper所对应的方法
package com.ape.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.ape.bean.Class;
public interface ClassMapper {
//一对多 用many=@Many(select="包名.类名.方法名")
@Results({
@Result(column = "classid",property = "classid"),
@Result(column = "classid",property = "slist",
many = @Many(select="com.ape.mapper.StudentMapper.findStudentByClassid"))
})
@Select("select * from Class")
public List<Class> findAllClass();
package com.ape.mapper;
import java.util.List;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.ape.bean.Student;
public interface StudentMapper {
@Select("select * from student where classid=#{classid}")
public Student findStudentByClassid(int classid);
}
注意:
一对多 用many=@Many(select="包名.类名.方法名")
查询结果:
以上就是Mybatis的多表关联查询(一对一、一对多)的全部内容。
看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]
加油!
共同努力!