
引入
MyBatis-Plus 的 部分 核心特性包括:
- 无侵入设计:不会改变 MyBatis 原有的 API 和使用方式,你可以自由选择 MyBatis 和 MyBatis-Plus 的功能。
- 自动 CRUD:通过
BaseMapper和ServiceImpl接口,MyBatis-Plus 提供了一系列 CRUD 操作的方法,如insert、delete、update和select,减少了重复的 SQL 编写工作。 - 条件构造器:MyBatis-Plus 提供了条件构造器(如
QueryWrapper),可以通过链式编程方式轻松构建复杂的查询条件。
快速开始
准备工作
添加依赖
以Spring Boot3 为例
可以用 MyBatis-Plus 的 starter 代替 MyBatis 的 starter
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.15</version>
</dependency>
配置
在application.yml中添加数据库的相关配置。
- MySQL 数据源配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
- MyBastis-Plus 核心配置
mybatis-plus:
# 指定 MyBatis Mapper 对应的 XML 文件位置
mapper-locations: classpath:/mapper/**/*.xml
# 指定 MyBatis 别名包扫描路径,用于给包中的类注册别名
type-aliases-package: com.example.demo.entity
Mapper 层基本操作
BaseMapper
BaseMapper 是 Mybatis-Plus 提供的一个基础 Mapper 接口,提供了一系列通用的数据库操作方法。
public class User {
private Long id;
private String name;
private Integer age;
private String email;
// Getter and Setter
}
public interface UserMapper extends BaseMapper<User> {
// 自定义方法
}
常见注解
MyBatis-Plus 通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
约定:
- 类名驼峰转下划线作为表名
- 名为
id的字段作为主键 - 变量名驼峰转下划线作为表的字段名
当不符合约定时,使用注解来进行配置:
@TableName:指定表名@TableId:指定表中的主键字段信息@TableField:指定表中的普通字段信息
@TableName
@TableName("sys_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
@TableId
@TableName("sys_user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
}
@TableField
@TableName("sys_user")
public class User {
@TableId
private Long id;
@TableField("nickname") // 映射到数据库字段 "nickname"
private String name;
private Integer age;
private String email;
}
常见配置
Configuration
mapUnderscoreToCamelCase
开启自动驼峰命名规则(camel case)映射,默认值 true
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
GlobalConfig
dbConfig
idType
默认值:ASSIGN_ID
IdType.AUTO:使用数据库自增 ID 作为主键。IdType.NONE:无特定生成策略,如果全局配置中有 IdType 相关的配置,则会跟随全局配置。IdType.INPUT:在插入数据前,由用户自行设置主键值。IdType.ASSIGN_ID:自动分配ID,适用于Long、Integer、String类型的主键。默认使用雪花算法通过IdentifierGenerator的nextId实现。IdType.ASSIGN_UUID:自动分配UUID,适用于String类型的主键。默认实现为IdentifierGenerator的nextUUID方法。
mybatis-plus:
global-config:
id-type: assign_id
条件构造器
条件构造器(
Wapper)用于构建复杂的数据库查询条件,构建条件后进项查询
常用的构造器有两类,一类是用于查询的条件构造器 QueryWrapper ,一类是用于更新的条件构造器 UpdateWrapper ,关系如下所示。

eq
eq 方法用于设置单个字段的相等条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "老王");
对应的 SQL 为:
SELECT * FROM user WHERE name = '老王';
ne
ne 用于设置单个字段的不相等条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ne("name", "老王");
对应的 SQL 为:
SELECT * FROM user WHERE name <> '老王';
| 方法 | 作用描述 | 示例 |
|---|---|---|
| eq | 等于 (=) 条件 | eq("name", "Tom") |
| ne | 不等于 (<>) 条件 | ne("status", 1) |
| gt | 大于 (>) 条件 | gt("age", 18) |
| ge | 大于等于 (>=) 条件 | ge("score", 60) |
| lt | 小于 (<) 条件 | lt("age", 30) |
| le | 小于等于 (<=) 条件 | le("price", 100) |
| between | BETWEEN … AND … 条件 | between("age", 18, 30) |
| notBetween | NOT BETWEEN … AND … 条件 | notBetween("age", 20, 25) |
| like | LIKE '%xxx%' 模糊查询 | like("name", "J") |
| notLike | NOT LIKE 条件 | notLike("desc", "test") |
| likeLeft | LIKE '%xxx' 左模糊 | likeLeft("name", "son") |
| likeRight | LIKE 'xxx%' 右模糊 | likeRight("name", "Jack") |
| in | IN(…) 条件 | in("id", Arrays.asList(1,2)) |
| notIn | NOT IN(…) 条件 | notIn("type", list) |
| isNull | IS NULL 条件 | isNull("remark") |
| isNotNull | IS NOT NULL 条件 | isNotNull("email") |
| orderByAsc | 升序排序 | orderByAsc("age") |
| orderByDesc | 降序排序 | orderByDesc("score") |
| select | 指定返回的字段 | select("id", "name") |
| last | 拼接在SQL语句后(如limit等) | last("limit 1") |
| or | 条件 OR 连接 | or() |
| and | 条件 AND 连接 | and() |
| apply | 直接拼接SQL片段 | apply("date_format(date,'%Y-%m-%d') = {0}", "2026-01-20") |
| exists | EXISTS 条件 | exists("sub_query_sql") |
| notExists | NOT EXISTS 条件 | notExists("sub_query_sql") |
Wrapper 可通过链式调用创建,如:
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.select("id","username","info")
.like("username","o")
.ge("balance",1000);
List<User> user = userMapper.selectList(wrapper);
// 更新所有balance大于1000且username包含“o”的用户的info字段为“已升级”
UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>()
.like("username", "o")
.ge("balance", 1000);
User user = new User();
user.setInfo("已升级");
int rows = userMapper.update(user, updateWrapper);
Comments NOTHING