目录
[1. MyBatis-Plus简介](#1. MyBatis-Plus简介)
[1.1 简介](#1.1 简介)
[1.2 特性](#1.2 特性)
[1.3 支持的数据库](#1.3 支持的数据库)
[1.4 框架结构](#1.4 框架结构)
[1.5 代码及文档地址](#1.5 代码及文档地址)
[2. 入门案例](#2. 入门案例)
[2.1 开发环境](#2.1 开发环境)
[2.2 创建数据库及表](#2.2 创建数据库及表)
[1. 创建表](#1. 创建表)
[2. 添加数据](#2. 添加数据)
[2.3 创建SpringBoot工程](#2.3 创建SpringBoot工程)
[1. 初始化工程](#1. 初始化工程)
[2. 引入依赖](#2. 引入依赖)
[3. IDEA中安装lombok插件](#3. IDEA中安装lombok插件)
[2.4 编写代码](#2.4 编写代码)
[1. 配置application.yml](#1. 配置application.yml)
[2. 启动类](#2. 启动类)
[3. 添加实体](#3. 添加实体)
[4. 添加mapper](#4. 添加mapper)
[5. 测试](#5. 测试)
[6. 添加日志](#6. 添加日志)
1. MyBatis-Plus简介
1.1 简介
MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具 ,在 MyBatis 的基础上只做增强不做改变 ,为 简化开发、提高效率而生 。Mybatis-Plus提供了通用的Mapper和Service,可以在不编写任何SQL语句的前提下,快速的实现单表的增删改查(CURD),批量,逻辑删除,分页等操作。只要把MyBatis-Plus的特性到优秀插件,以及多数据源的配置进行详细讲解。
愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

1.2 特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
1.3 支持的数据库
任何能使用MyBatis进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下

1.4 框架结构

1.5 代码及文档地址
官方地址: http://mp.baomidou.com
代码发布地址:
Github: GitHub - baomidou/mybatis-plus: An powerful enhanced toolkit of MyBatis for simplify development
Gitee: mybatis-plus: mybatis 增强工具包,简化 CRUD 操作。 文档 http://baomidou.com低代码组件库 http://aizuda.com
文档发布地址: https://baomidou.com/pages/24112f
2. 入门案例
2.1 开发环境
IDE: idea 2017
JDK:JDK1.8
构建工具: maven 3.6.0
MySQL版本: MySQL 5.6 (mysql常用版本:5.6 5.7 8.0)
Spring Boot:2.7.4
MyBatis-Plus:3.5.1
2.2 创建数据库及表
1. 创建表
sql
CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名 ',
`age` int(11) DEFAULT NULL COMMENT '年龄 ',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱 ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. 添加数据
sql
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');

2.3 创建SpringBoot工程
1. 初始化工程
使用 Spring Initializr 快速初始化一个 Spring Boot 工程


2. 引入依赖
XML
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
3. IDEA中安装lombok插件

2.4 编写代码
1. 配置application.yml
java
spring:
# 配置数据源信息
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
username: root
password: 2020
相关解释 :
数据库连接池:
Spring Boot 1.x 版本默认的数据库连接池是 org.apache.tomcat.jdbc.pool.DataSource
。在 Spring Boot 2.x 版本及以后,默认的数据库连接池是 com.zaxxer.hikari.HikariDataSource
。
驱动类:
在 MySQL 5.x 版本中,推荐使用的 JDBC 驱动类是 com.mysql.jdbc.Driver。不过从 MySQL Connector/J 5.1.47 版本开始,官方更推荐使用 com.mysql.cj.jdbc.Driver 这个新的驱动类。
而到了 MySQL 8.0 版本,com.mysql.jdbc.Driver 被标记为已过时,官方只支持使用
com.mysql.cj.jdbc.Driver。
注意!!
1、驱动类driver-class-name
spring boot 2.0 (内置jdbc5驱动),驱动类使用:
javadriver-class-name: com.mysql.jdbc.Driver
spring boot2.1及以上(内置jdbc8驱动),驱动类使用:
javadriver-class-name: com.mysql.cj.jdbc.Driver
否则运行测试用例的时候会有 WARN 信息
2、连接地址url
MySQL5.7版本的url:
javajdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
MySQL8.0版本的url:
javajdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
否则运行测试用例报告如下错误:
javajava.sql.SQLException: The server time zone value'Öйú±ê׼ʱ¼ä' is unrecognized or represents more
2. 启动类
在Spring Boot启动类中添加**@MapperScan**注解,扫描mapper包。
用途是扫描指定包路径下的 Mapper 接口,并且将这些接口自动注册为 Spring Bean。如此一来,你就能在服务层里直接注入这些 Mapper 接口,进而使用它们来操作数据库。
java
@SpringBootApplication
@MapperScan("com.qcby.mybatisplus.mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
3. 添加实体
java
@Data //lombok注解
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
快捷键:ctrl+F12 查看类结构。

只有**@Data**注解时,没有含参的构造器。

@AllArgsConstructor 注解可以自动为类生成一个包含所有成员变量的构造函数。
但是如果只加 @AllArgsConstructor 就没有无参的构造器了,需要再加一个**@NoArgsConstructor**,构造无参构造器。
@Getter注解,显然是构造访问器。
@Setter注解,构造更改器。
4. 添加mapper
BaseMapper 是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的 实体类型。
java
public interface UserMapper extends BaseMapper<User> {
}
java
package com.baomidou.mybatisplus.core.mapper;
public interface BaseMapper<T> extends Mapper<T> {
/**
* 插入一条记录
* @param entity 实体对象 */
int insert(T entity);
/**
* 根据 ID 删除
* @param id 主键ID */
int deleteById(Serializable id);
/**
* 根据实体(ID)删除
* @param entity 实体对象
* @since 3.4.4 */
int deleteById(T entity);
/**
* 根据 columnMap 条件,删除记录
* @param columnMap 表字段 map 对象 */
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,删除记录
* @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where
语句)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 删除(根据ID 批量删除)
* @param idList 主键ID列表(不能为 null 以及 empty) */
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 根据 ID 修改
* @param entity 实体对象 */
int updateById(@Param(Constants.ENTITY) T entity);
/**
* 根据 whereEntity 条件,更新记录
* @param entity 实体对象 (set 条件值 ,可以为 null)
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成
where 语句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
/**
* 根据 ID 查询
* @param id 主键ID */
T selectById(Serializable id);
/**
* 查询(根据ID 批量查询)
* @param idList 主键ID列表(不能为 null 以及 empty) */
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 查询(根据 columnMap 条件)
* @param columnMap 表字段 map 对象 */
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根据 entity 条件,查询一条记录
* <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录 , 注意:多条数据会报异常 </p>
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) { List<T> ts = this.selectList(queryWrapper);
if (CollectionUtils.isNotEmpty(ts)) {
if (ts.size() != 1) {
throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");
}
return ts.get(0);
}
return null;
}
/**
* 根据 Wrapper 条件,查询总记录数
* @param queryWrapper 实体对象封装操作类(可以为 null) */
Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录
* <p>注意: 只返回第一个字段的值</p>
* @param queryWrapper 实体对象封装操作类(可以为 null) */
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 entity 条件,查询全部记录(并翻页)
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null) */
<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类 */
<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
5. 测试
java
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectList(){
//selectList()根据MP内置的条件构造器查询一个list集合,null表示没有条件,即查询所有
userMapper.selectList(null).forEach(System.out::println);
}
可以直接注入接口的原因是:
在测试类里注入 Mapper 接口时,实际上注入的是 MyBatis-Plus 为该接口生成的代理对象。MyBatis-Plus 会为扫描到的 Mapper 接口创建代理对象。这些代理对象实现了 Mapper 接口的方法,并且在方法调用时会和数据库进行交互。
结果:

注意:
IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确 的执行。
为了避免报错,可以在mapper接口上添加 @Repository 注解
java
@Repository
public interface UserMapper extends BaseMapper<User> {
}
原因:
在 Spring 框架里,@Repository 是一个重要的注解,它主要用于将一个类标记为数据访问层(DAO,Data Access Object)的组件。
@Repository 注解用于告诉 Spring 容器,被注解的类是一个数据访问对象,负责与数据库、文件系统等数据源进行交互。Spring 会自动将这个类注册为一个 Bean,这样你就可以在其他组件中通过依赖注入的方式使用它。
6. 添加日志
在application.yml中配置日志输出
java
# 配置MyBatis日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

可以看到执行的sql语句。