多表查询和单表查询类似,只是 SQL 不同而已
上面我们建立了一个用户表,我们再来建立一张文章表,进行多表关联查询
uidid数据准备:
对应 Model:
package com.glg.mybatis.module;
import lombok.Data;
import java.util.Date;
@Data
public class ArticleInfo {
private Integer id;
private String title;
private String content;
private Integer uid;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}需求:根据 uid 查询作者的名称等相关信息
SQL:
SELECT
ta.id,
ta.title,
ta.content,
ta.uid,
tb.username,
tb.age,
tb.gender
FROM
articleinfo ta
LEFT JOIN userinfo tb ON ta.uid = tb.id
WHERE
ta.id = 1补充实体类:
package com.glg.mybatis.model;
import lombok.Data;
import java.util.Date;
@Data
public class ArticleInfo {
private Integer id;
private String title;
private String content;
private Integer uid;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
// 用户相关的信息
private String username;
private Integer gender;
}ArticleInfoMapper 接口定义:
package com.glg.mybatis.mapper;
import com.glg.mybatis.model.ArticleInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ArticleInfoMapper {
ArticleInfo selectArticleAndUserById(Integer id);
}ArticleInfoMapper.xml 实现:
<select id="selectArticleAndUserById" resultType="com.glg.mybatis.model.ArticleInfo">
select ta.*, tb.username, tb.gender
from articleinfo ta
left join userinfo tb
on ta.uid = tb.id
where ta.id = #{id}
</select>
MyBatis 参数赋值有两种⽅式,咱们前⾯使⽤了 #{} 进⾏赋值,接下来我们看下⼆者的区别
// $ 和 # 的区别
@Select("select * from userinfo where username = #{username}")
UserInfo getUserByName(String userName);
@Select("select * from userinfo where username = ${username}")
UserInfo getUserByName2(String userName);
SQL 语句报错了,admin 少了引号#:是预编译 SQL,占位的方式$:是即时 SQL,直接拼接# 比 $ 的性能高在上面 MyBatis 的讲解中,我们使用了数据库连接池技术,避免频繁的创建连接,销毁连接
接下来我们了解一下数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

SQL 语句,要先创建一个新的连接对象,然后执行 SQL 语句,SQL 语句执行完,再关闭连接对象释放资源。这种重复的创建连接、销毁连接比较消耗资源Connection 对象,当客户请求数据库连接池,会从数据库连接池中获取 Connection 对象,然后执行 SQL,SQL 语句执行完,再把 Connection 归还给连接池优点:
常见的数据库连接池
C3P0DBCPDruidHikari
目前比较流行的是:Hikari、DruidHikari:SpringBoot 默认使用的是数据库连接池
Hikari是日语“光”的意思,Hikari也是以追求性能极致为目标
Durid如果我们想把默认的数据库连接池切换为 Durid 数据库连接池,只需要引入相关依赖即可
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.25</version>
</dependency>参考官方地址: https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
Durid 连接池是阿里巴巴开源数据库连接池项目Java 语言最好的数据连接池之一
MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写的。因此,数据库名、表名、字段名都不允许出现任何大写字母,避免节外生枝
aliyun_admin,rdc_config,level3_nameAliyunAdmin,rdcConfig,level_3_nameid,create_time,update_time
id必为主键,类型为bigint unsigned,单表自增时,步长为 1create_time,update的类型均为datetime类型,create_time表示创建时间,update_time表示更新时间
* 作为查询的字段列表,标明需要哪些字段resultMap 配置不一致text 类型的字段