# MyBatisPlus 简介
# 概念
MyBatisPlus 是基于 MyBatis 框架基础上开发的增强工具,简化开发,提高效率
- 无侵入:只做增强不做改变,不会对现有工程产生影响
- 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现表单 CRUD 操作
- 支持 Lambda:编写查询条件无需担心写错字段
- 支持主键自动生成
- 内置分页插件
# 标准数据层开发
# 标准数据层 CRUD 功能
功能 | 自定义接口 | MP 接口 |
---|---|---|
新增 | boolean save(T t) |
int insert(T t) |
删除 | boolean delete(int id) |
int deleteById(Serializable id) |
修改 | boolean update(T t) |
int updateById(T t) |
根据 id 查询 | T getById(int id) |
T selectById(Serializable id) |
查询全部 | List<T> getAll() |
List<T> selectList() |
分页查询 | PageInfo<T> getAll(int page, int size) |
IPage<T> selectPage(IPage<T> page) |
按条件查询 | List<T> getAll(Condition condition) |
IPage<T> selectPage(Wrapper<T> queryWrapper) |
# DQL 编程控制
# 条件查询 —— 设置查询条件
# 格式一:常规格式
QueryWrapper<User> qw = new QueryWrapper<User>(); | |
qw.lt("age",65); | |
qw.ge("age",20); | |
List<User> userList = userDao.selectList(qw); | |
System.out.println(userList); |
# 格式二:链式编程
QueryWrapper<User> qw = new QueryWrapper<User>(); | |
qw.lt("age",65).ge("age",18); | |
List<User> userList = userDao.selectList(qw); | |
System.out.println(userList); |
# Lambda 格式
QueryWrapper<User> qw = new QueryWrapper<User>(); | |
qw.lambda().lt(User::getAge,65).ge(User::getAge,18); | |
List<User> list = userDao.selectList(qw); | |
System.out.println(userList); |
# Lambda 格式
LambdaQueryWarpper<User> lqw = LambdaQueryWrapper<User>(); | |
lqw.lt(User::getAge, 65).ge(User::getAge,18); | |
List<User> userList = userDao.selectList(lqw); | |
System.out.println(userList); |
# 条件查询 ——null 值处理
LambdaQueryWrapper lqw = new LambdaQueryWrapper<User>(); | |
lqw.lt(user.getAge != null, User::getAge); | |
List<User> list = userDao.selectList(lqw); |
# 查询条件设置
LambdaQueryWrapper lqw = new LambdaQueryWrapper<User>(); | |
lqw.eq(User.getName, user.getName()); | |
List<User> list = userDao.selectList(lqw); |
# 字段映射与表名映射
# 字段映射
- 名称:
@TableField
- 类型:属性注解
- 位置:模型类属性定义上方
- 作用:设置当前属性对应的数据库表中的字段关系
- 相关属性:
- value(默认),设置数据库表字段名称
- exist:true 表示表中有对应字段,false 表示没有字段
- select:设置属性是否参与查询,此属性与 select () 映射配置不冲突
public class User { | |
@TableField(value = "pwd",select = false) | |
private String password; | |
@TableField(existt = false) | |
private Integer online; | |
} |
# 表名映射
- 名称:
TableName
- 类型:类注解
- 位置:模型类定义上方
- 作用:设置当前类对应与数据库表关系
- 相关属性:
- value:设置数据库表名称
@TableName("tbl_user") | |
public class User { | |
private Long id; | |
} |
# id 生成策略控制
# 不同 id 生成策略
- AUTO (0):使用数据库 id 自增策略控制 id 生成
- NONE (1):不设置 id 生成策略
- INPUT (2):用户手工输入 id
- ASSIGN (3):雪花算法生成 id(可兼容数值型与字符串型)
- ASSIGN_UUID (4):以 UUID 生成算法作为 id 生成策略
# id 生成策略注解
- 名称:
TableId
- 类型:类注解
- 位置:字段上方
- 作用:设置当前 Id 值得生成策略
- 相关属性:
- type:生成策略类型
@TableName("user") | |
public class User { | |
@TableId(type = IdType.AUTO) | |
private Long id; | |
} |
# 全局配置 id 生成策略
mybatis-plus: | |
golbal-config: | |
db-config: | |
id-Type: aoto | |
table-prefix: tbl_ |
# 逻辑删除
# 概述
- 删除操作业务问题:业务数据从数据库中丢弃
- 逻辑删除:为了数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中
# 实现步骤
# 数据库添加逻辑删除标记字段
# 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
public class User { | |
private Long id; | |
private Integer deleted; | |
} |
# 配置逻辑删除字面值
mybatis-plus: | |
global-config: | |
db-config: | |
logic-delete-field: deleted | |
logic-not-delete-value: 0 | |
logic-delete-value: 1 |
# 乐观锁
# 数据库表中添加锁标记字段
# 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
public class User { | |
private Long id; | |
@Version | |
private Integer version; | |
} |
# 配置乐观锁拦截器实现锁机制对应得动态 sql 语句拼接
@Configuration | |
public class MpConfig { | |
@Bean | |
public MyBatisPlusInterceptor mpInterceptor() { | |
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); | |
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); | |
return mpInterceptor; | |
} | |
} |
# 代码生成器
# 导入坐标
<dependency> | |
<groupId>com.mysql</groupId> | |
<artifactId>mysql-connector-j</artifactId> | |
<scope>runtime</scope> | |
</dependency> | |
<dependency> | |
<groupId>com.baomidou</groupId> | |
<artifactId>mybatis-plus-boot-starter</artifactId> | |
<version>3.4.3</version> | |
</dependency> | |
<!--druid--> | |
<dependency> | |
<groupId>com.alibaba</groupId> | |
<artifactId>druid</artifactId> | |
<version>1.1.16</version> | |
</dependency> | |
<!--lombok--> | |
<dependency> | |
<groupId>org.projectlombok</groupId> | |
<artifactId>lombok</artifactId> | |
</dependency> | |
<!-- 代码生成器 --> | |
<dependency> | |
<groupId>com.baomidou</groupId> | |
<artifactId>mybatis-plus-generator</artifactId> | |
<version>3.4.1</version> | |
</dependency> | |
<!--velocity 模板引擎 --> | |
<dependency> | |
<groupId>org.apache.velocity</groupId> | |
<artifactId>velocity-engine-core</artifactId> | |
<version>2.3</version> | |
</dependency> |
# 实现代码生成器
import com.baomidou.mybatisplus.annotation.IdType; | |
import com.baomidou.mybatisplus.generator.AutoGenerator; | |
import com.baomidou.mybatisplus.generator.config.DataSourceConfig; | |
import com.baomidou.mybatisplus.generator.config.GlobalConfig; | |
import com.baomidou.mybatisplus.generator.config.PackageConfig; | |
import com.baomidou.mybatisplus.generator.config.StrategyConfig; | |
public class CodeGenerator { | |
public static void main(String[] args) { | |
//1. 获取代码生成器的对象 | |
AutoGenerator autoGenerator = new AutoGenerator(); | |
// 设置数据库相关配置 | |
DataSourceConfig dataSource = new DataSourceConfig(); | |
dataSource.setDriverName("com.mysql.cj.jdbc.Driver"); | |
dataSource.setUrl("jdbc:mysql://localhost:3306/reggie?serverTimezone=UTC"); | |
dataSource.setUsername("root"); | |
dataSource.setPassword("root"); | |
autoGenerator.setDataSource(dataSource); | |
// 设置全局配置 | |
GlobalConfig globalConfig = new GlobalConfig(); | |
globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java"); // 设置代码生成位置 | |
globalConfig.setOpen(false); // 设置生成完毕后是否打开生成代码所在的目录 | |
globalConfig.setAuthor("baozi"); // 设置作者 | |
globalConfig.setFileOverride(true); // 设置是否覆盖原始生成的文件 | |
globalConfig.setMapperName("%sDao"); // 设置数据层接口名,% s 为占位符,指代模块名称 | |
globalConfig.setIdType(IdType.AUTO); // 设置 Id 生成策略 | |
autoGenerator.setGlobalConfig(globalConfig); | |
// 设置包名相关配置 | |
PackageConfig packageInfo = new PackageConfig(); | |
packageInfo.setParent("com.baozi"); // 设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径 | |
packageInfo.setEntity("entity"); // 设置实体类包名 | |
packageInfo.setMapper("dao"); // 设置数据层包名 | |
autoGenerator.setPackageInfo(packageInfo); | |
// 策略设置 | |
StrategyConfig strategyConfig = new StrategyConfig(); | |
strategyConfig.setInclude("user"); // 设置当前参与生成的表名,参数为可变参数 | |
//strategyConfig.setTablePrefix ("tbl_"); // 设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名 例如: User = tbl_user - tbl_ | |
strategyConfig.setRestControllerStyle(true); // 设置是否启用 Rest 风格 | |
//strategyConfig.setVersionFieldName ("version"); // 设置乐观锁字段名 | |
//strategyConfig.setLogicDeleteFieldName ("deleted"); // 设置逻辑删除字段名 | |
strategyConfig.setEntityLombokModel(true); // 设置是否启用 lombok | |
autoGenerator.setStrategy(strategyConfig); | |
//2. 执行生成操作 | |
autoGenerator.execute(); | |
} | |
} |