MyBatisPlus 用法详解
MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了丰富的功能,包括强大的CRUD操作、条件构造器、自动填充、分页插件等,极大地简化了开发工作。以下是对MyBatis-Plus的详细用法介绍。
一、MyBatis-Plus简介
MyBatis-Plus的官网地址为:https://mybatis.plus/ 或 https://mp.baomidou.com/。
MyBatis-Plus的主要特性包括:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响。
- 损耗小:启动即会自动注入基本CRUD,性能基本无损耗,直接面向对象操作。
- 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
- 支持Lambda形式调用:通过Lambda表达式,方便地编写各类查询条件,无需再担心字段写错。
- 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器-Sequence),可*配置,完美解决主键问题。
- 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作。
- 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
- 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置。
- 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
- 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
二、MyBatis-Plus基本使用
1. 引入依赖
MyBatis-Plus提供了starter,实现了自动Mybatis以及MyBatis-Plus的自动装配功能。在Maven项目的pom.xml
文件中添加以下依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本号</version>
</dependency>
注意:尽量不要同时导入MyBatis和MyBatis-Plus,避免版本差异。
2. 配置数据库连接
在application.yml
或application.properties
文件中配置数据库连接信息。例如,使用application.yml
文件:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: 账号
password: 密码
3. 使用
在Spring Boot启动类中添加@MapperScan
注解,扫描Mapper文件夹:
@SpringBootApplication
@MapperScan("com.example.mapper") // 替换为你的Mapper所在的类路径
public class MyBatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MyBatisPlusApplication.class, args);
}
}
在对应的Mapper上面添加@Mapper
注解,并继承BaseMapper<>
类:
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 所有的CRUD都已经完成,不需要像以前一样配置一大堆文件
}
其中,User
是实体类,对应数据库中的一张表。
4. 编写实体类
实体类通常使用Lombok库来简化代码。例如:
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
// 其他字段...
}
MyBatis-Plus会根据PO实体(BaseMapper<T>
中的T
)的信息来推断出表的信息,从而生成SQL。默认情况下,MyBatis-Plus会把PO实体的类名驼峰转下划线作为表名,把PO实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型。如果默认实现与实际场景不符,可以使用注解来声明表信息。
- @TableName:标识实体类对应的表。当实体类的名称和表名的命名不一致时使用。
-
@TableId:标识实体类中的主键字段。如果主键字段的命名符合规范(如
id
),则不需要使用该注解。 - @TableField:标识实体类中的普通属性。当实体类的命名和数据库的字段名有出入时使用。
三、CRUD操作
MyBatis-Plus提供了丰富的CRUD操作方法,这些方法都定义在BaseMapper
接口中。
1. 插入
使用insert
方法插入一条记录:
User user = new User();
user.setName("张三");
user.setAge(18);
// 其他字段设置...
userMapper.insert(user);
2. 删除
使用deleteById
方法根据主键删除一条记录:
userMapper.deleteById(1L);
使用deleteBatchIds
方法根据主键批量删除记录:
List<Long> ids = Arrays.asList(1L, 2L, 3L);
userMapper.deleteBatchIds(ids);
3. 更新
使用updateById
方法根据主键更新一条记录:
User user = new User();
user.setId(1L);
user.setName("李四");
// 其他字段设置(需要更新的字段)...
userMapper.updateById(user);
4. 查询
使用selectById
方法根据主键查询一条记录:
User user = userMapper.selectById(1L);
使用selectList
方法查询所有记录:
List<User> userList = userMapper.selectList(null);
使用条件构造器Wrapper
进行复杂查询。例如,查询年龄大于18岁的用户:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18);
List<User> userList = userMapper.selectList(queryWrapper);
四、条件构造器
MyBatis-Plus提供了强大的条件构造器,用于构建复杂的查询条件。条件构造器的核心类是Wrapper
,其子类包括QueryWrapper
和UpdateWrapper
。
1. 基本比较操作
使用eq
、ne
、gt
、ge
、lt
、le
等方法进行基本比较操作。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三"); // 等价于 WHERE name = '张三'
queryWrapper.ne("age", 18); // 等价于 WHERE age <> 18
2. 模糊查询
使用like
、notLike
、likeLeft
、likeRight
等方法进行模糊查询。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张"); // 等价于 WHERE name LIKE '%张%'
3. 排序
使用orderByAsc
、orderByDesc
等方法进行排序。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("age"); // 等价于 ORDER BY age ASC
4. 逻辑查询
使用and
、or
、nested
等方法进行逻辑查询。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.and(wrapper -> wrapper.eq("name", "张三").ne("age", 18));
// 等价于 WHERE (name = '张三' AND age <> 18)
5. select
使用select
方法指定查询的字段。例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name", "age"); // 只查询name和age字段
List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper);
五、ActiveRecord
MyBatis-Plus支持ActiveRecord模式,实体类只需继承Model
类即可进行强大的CRUD操作。不过,需要注意的是,从MyBatis-Plus 3.x版本开始,Model
类已经被废弃,推荐使用BaseEntity
或自定义实体类配合BaseMapper
进行CRUD操作。