使用Mybatis的动态Sql实现多表查询

具体实现(student项目)

创建数据库

1
2
3
4
5
6
7
8
9
10
11
create table teacher(
id int(10) primary key auto_increment,
name varchar(20)
);

create table student(
id int(10) primary key auto_increment,
name varchar(20),
age int(3),
tid int(10)
);

数据库情况:

学生表添加外键:

搭建环境

1. 导入相关jar包
2. 准备mybatis.xml全局配置文件(里面利用package标签找那个接口!!!!)
3. 准备student实体类
4. 准备teacher实体类
5. 准备pageInfo分页实体类
6. 准备实现类接口StudentMapper
...

Mybatis实现多表查询方式

多表查询三种方式

1. 业务装配:
    两表单表查询 -- 在业务(service)将查询结果关联
2. 通过Auto Mapping特性
    两表联合查询 -- 通过别名完成映射    
3. 使用Mybatis的resultMap标签进行实现

类中(其他类) 分类

1. 单个对象

2. 集合对象

单表resultMap

resultMap标签(mapper.xml中)

程序员控制sql查询结果与实体类的映射关系
默认:Mybatis使用Auto Mapping特性(resultType属性)
更改:Mybatis使用resultMap属性引用resultMap标签(不写resultType属性)

具体操作

1. 数据库(id和name两列):

2. 实体类(我们用id1和name1区别)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Teacher {
private int id1;
private String name1;

public int getId1() {
return id1;
}
public void setId1(int id1) {
this.id1 = id1;
}
public String getName1() {
return name1;
}
public void setName1(String name1) {
this.name1 = name1;
}

}

3. 在TeacherMapper.xml配置文件中使用resultMap标签:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<mapper namespace="com.bjsxt.mapper.TeacherMapper">

<resultMap type="teacher" id="mymap">
<!-- 主键用id -->
<id column="id" property="id1"/>
<!-- 其他列用result -->
<result column="name" property="name1"/>
</resultMap>

<select id="selAll" resultMap="mymap">
select * from teacher
</select>

</mapper>

单表总结使用

1. 实体类去写需要映射的名称(id和name 实体类就写id1和name1)
2. 配置文件中select里面把resultType改成使用resultMap属性 
    注: resultMap属性值 == resultMap标签的id值
3. 书写resultMap标签
    注: resultMap两个属性一个是类型 一个是和select里面属性匹配的id
         主键使用id标签 其他列用result标签
         里面column写的是数据库的名称 property写的是映射的实体类名称

resultMap实现关联单个对象(N+1方式) association标签

就是先查询出一个表的全部信息 然后根据这个表的信息再查另外一个表的信息(两个表合并)

具体操作

1. 学生数据库的tid是刚才老师id的外键

2. 学生实体类除了自己的属性还要有一个老师的对象

1
2
3
4
5
6
 //只列举了变量
private int id;
private String name;
private int age;
private int tid;
private Teacher teacher; //老师类的对象!!!!!!

3. 学生配置文件(通过association标签把tid给老师的sql语句中当做id)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<mapper namespace="com.bjsxt.mapper.StudentMapper">

<resultMap type="student" id="linahe">

<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<result column="tid" property="tid"/>
<association property="teacher" select="com.bjsxt.com.TeacherMapper.selById" column="tid"></association>

</resultMap>

<select id="selAll" resultMap="lianhe">
select * from student
</select>

</mapper>

4. 老师配置文件(只写根据id查老师信息的sql语句)

1
2
3
4
5
6
7
<mapper namespace="com.bjsxt.mapper.TeacherMapper">

<select id="selById" resultType="teacher" parameterType="int"> //只需要写好根据id查老师的sql操作
select * from teacher where id=#{id}
</select>

</mapper>

结果分析

图例分析流程:

具体实现过程:

1. 准备老师和学生类(要有老师类对象)
2. 准备老师的配置文件(通过id查询结果)
3. 准备学生的配置文件
    3.1 先写自己的sql语句 -- resultMap属性连接到resultMap标签的id  -- id标签写学生的主键映射 result标签写学生的其他列映射
    3.2 一定要用association标签!!!(column属性把学生的tid拿过来 select去掉老师配置文件的sql语句的方法名一定是全路径!!)

resultMap实现关联集合对象(N+1方式) colloction标签

其实关联 集合对象(老师返回学生的list集合) / 单个对象(学生传老师一个对象) 只是从不同角度来看!!!!!!

具体操作

1. teacher实体类(放的就是list集合)

1
2
3
private int id;
private String name;
private List<Student> list; //list集合返回结果

2. student配置文件(只需要写简单的sql语句让老师传过来id当tid用)

1
2
3
4
5
6
7
<mapper namespace="com.bjsxt.mapper.StudentMapper">

<select id="selByTid" resultType="student" parameterType="int">
select * from student where tid=#{id}
</select>

</mapper>

3. teacher老师配置文件(通过collection标签将id传过去当tid查)

1
2
3
4
5
6
7
8
9
10
11
12
13
<mapper namespace="com.bjsxt.mapper.TeacherMapper">

<resultMap type="teacher" id="mymap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="list" ofType="student" select="com.bjsxt.mapper.StudentMapper.selByTid" column="id"></collection>
</resultMap>

<select id="selAll" resultMap="mymap">
select * from teacher
</select>

</mapper>

结果分析

图例分析流程:

具体实现过程:

1. 准备老师类(要有list集合返回学生类信息)和学生类
2. 准备学生的配置文件(只需要sql语句通过id查所有信息)
3. 准备老师的配置文件
    3.1 通过查询的sql语句去找resultMap标签 然后标签去找学生配置文件的方法查处结果(将id传过去当tid用)

多表resultMap加载集合对象联合查询方式

假设老师1有多个学生(数据库会一下子很多行) – 我们现在让老师1 后面跟学生(减少重复每次都要出现老师1)

具体操作

1. teacher实体类(放的就是list集合)

1
2
3
private int id;
private String name;
private List<Student> list; //list集合返回结果

2. 只在teacher配置文件改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<mapper namespace="com.bjsxt.mapper.TeacherMapper">
<resultMap type="teacher" id="mymap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection property="list" select="com.bjsxt.mapper.StudentMapper.selByTid" column="id"></collection>
</resultMap>

<select id="selAll" resultMap="mymap">
select * from teacher
</select>

<resultMap type="teacher" id="mymap1">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
<collection property="list" ofType="student" >
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<result column="age" property="age"/>
<result column="tid" property="tid"/>
</collection>
</resultMap>

<select id="selAll1" resultMap="mymap1">
select t.id tid,t.name tname,s.id sid,s.name sname,age,tid from teacher t LEFT JOIN student s on t.id=s.tid;
</select>

</mapper>

结果分析

图例分析流程:

具体实现过程:

1. 准备老师类(要有list集合返回学生类信息)和学生类
2. 准备学生的配置文件(只需要sql语句通过id查所有信息)
3. 准备老师的配置文件
    3.1 通过查询的sql语句去找resultMap标签 然后标签去找学生配置文件的方法查处结果(将id传过去当tid用)
    3.2 因为他返回的结果我需要一个老师对应很多学生 -- 所以我们要再写一个resultMap标签去映射list(一行一行给) --最终通过这个标签返回答案

AutoMapping加载单个对象 ( 添加反单引号 )

使用多表联合查询(起别名!!)

具体操作

1. 学生实体类(老师类对象)

1
2
3
4
5
6
 //只列举了变量
private int id;
private String name;
private int age;
private int tid;
private Teacher teacher; //老师类的对象!!!!!!

2. teacher配置文件(一个是student)

1
2
3
4
5
6
<mapper namespace="com.bjsxt.mapper.TeacherMapper">
<select id="selAll" resultType="teacher">
select t.id id,t.name name,s.id `list.id`,s.name `list.name`,age `list.age`,tid `list.tid`
from teacher t LEFT JOIN student s on t.id=s.tid //展示的是list集合输出
</select>
</mapper>

3. student配置文件(里面通过老师对象(反单引号) teacher.id等传过来用)

1
2
3
4
5
6
7

<mapper namespace="com.bjsxt.mapper.StudentMapper">
<select id="selAll" resultType="student">
select t.id `teacher.id`,t.name `teacher.name`,s.id id,s.name name,age,tid
from student s LEFT JOIN teacher t on t.id=s.tid //里面通过老师对象(反单引号) teacher.id等传过来用)
</select>
</mapper>

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 具体实现(student项目)
    1. 1.1. 创建数据库
    2. 1.2. 搭建环境
  2. 2. Mybatis实现多表查询方式
    1. 2.1. 多表查询三种方式
    2. 2.2. 类中(其他类) 分类
  3. 3. 单表resultMap
    1. 3.1. resultMap标签(mapper.xml中)
    2. 3.2. 具体操作
    3. 3.3. 单表总结使用
  4. 4. resultMap实现关联单个对象(N+1方式) association标签
    1. 4.1. 具体操作
    2. 4.2. 结果分析
  5. 5. resultMap实现关联集合对象(N+1方式) colloction标签
    1. 5.1. 具体操作
    2. 5.2. 结果分析
  6. 6. 多表resultMap加载集合对象联合查询方式
    1. 6.1. 具体操作
    2. 6.2. 结果分析
  7. 7. AutoMapping加载单个对象 ( 添加反单引号 )
    1. 7.1. 具体操作
,