MyBatis-Plus基础用法总结
...大约 7 分钟
MyBatis-Plus
1. 引入
<properties>
<java.version>1.8</java.version>
<mp.version>3.5.1</mp.version>
<freemarker.version>2.3.31</freemarker.version>
</properties>
<dependencies>
<!--mybatis-plus启动器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mp.version}</version>
</dependency>
<!--lombok用于简化实体类开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--自动生成代码-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mp.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
</dependencies>
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
table-prefix: t_
id-type: assign_id
type-enums-package: com.atguigu.mybatisplus.enums # 枚举类
2. 基本CRUD
BaseMapepr
@Mapper
public interface UserMapper extends BaseMapper<User> {
Page<User> selectPageVo(@Param("page") Page<User> page,@Param("age") Integer age);
}
IService
public interface UserService extends IService<User> {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
3. 常用注解
1. @TableName
2. @TableId
3. @TableField
4. @TableLogic
4. 条件构造器和常用接口
- Wrapper : 条件构造抽象类,最顶端父类
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
- QueryWrapper : 查询条件封装
- UpdateWrapper : Update 条件封装
- AbstractLambdaWrapper : 使用Lambda 语法
- LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
- LambdaUpdateWrapper : Lambda 更新封装Wrapper
5. 插件
1. 分页插件
1. 添加配置类
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
2. 使用
public void testPageVo() {
Page<User> page = new Page<>(2,3);
userMapper.selectPageVo(page,24);
System.out.println(page.getRecords());
System.out.println(page.getPages());
System.out.println(page.getTotal());
System.out.println(page.getCurrent());
System.out.println(page.hasNext());
System.out.println(page.hasPrevious());
}
2. 乐观锁插件
1. 配置类同上
2. 使用
public void testProduct02() {
//1、小李
Product p1 = productMapper.selectById(1L);
System.out.println("小李取出的价格:" + p1.getPrice());
//2、小王
Product p2 = productMapper.selectById(1L);
System.out.println("小王取出的价格:" + p2.getPrice());
//3、小李将价格加了50元,存入了数据库
p1.setPrice(p1.getPrice() + 50);
int result1 = productMapper.updateById(p1);
System.out.println("小李修改结果:" + result1);
//4、小王将商品减了30元,存入了数据库
p2.setPrice(p2.getPrice() - 30);
int result2 = productMapper.updateById(p2);
if (result2 == 0) {
p2 = productMapper.selectById(1L);
p2.setPrice(p2.getPrice() - 30);
result2 = productMapper.updateById(p2);
}
System.out.println("小王修改结果:" + result2);
//最后的结果
Product p3 = productMapper.selectById(1L);
//价格覆盖,最后的结果:70
System.out.println("最后的结果:" + p3.getPrice());
}
6. 代码生成器
1. 引入依赖
<!--自动生成代码-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
2. 配置生成器类的代码
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import java.util.Collections;
/**
* @author dongzhaohe
* @version V1.0
* @ClassName: FastAutoGeneratorTest
* @Description:
* @date 2022/4/22 12:09
*/
@SpringBootTest
public class FastAutoGeneratorTest {
@Test
public void test() {
FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false&serverTimezone=UTC", "root", "root")
.globalConfig(builder -> {
builder.author("atguigu") // 设置作者
// .enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("G://mybatis_plus_g"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.atguigu") // 设置父包名
.moduleName("mybatisplus") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "G://mybatis_plus_g"));// 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("t_user") // 设置需要生成的表名
.addTablePrefix("t_", "c_"); // 设置过滤表前缀
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker 引擎模板,默认的是Velocity引擎模板
.execute();
}
}
7. 多数据源
1. 引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
2. 配置多数据源
spring:
# 配置数据源信息
datasource:
dynamic:
# 设置默认的数据源或者数据源组,默认值即为master
primary: master
# 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
master:
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave_1:
url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&userSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
3. 使用
@DS("slave_1")
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}
参考
1.配置:
pom
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
mapper
mapperscan
2.MP注解:
TableName 表名注解
TableId 主键注解
TableField 字段注解
Version 乐观锁注解
EnumValue 枚举类注解
TableLogic 表字段逻辑处理注解
SqlParser 租户注解
KeySequence 序列主键策略
3.代码生成器
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
4.CRUD接口
Service CRUD接口:
通用的Service CRUD 封装IService接口,进一步封装CRUD
采用get查询单行、remove删除、list查询集合、page分页,前缀命
名方式区分mapper层避免混淆
泛型T为任意实体对象
建议如果存在自定义通用Service方法的可能,请创建自己的
IBaseService继承MP提供的基类
对象Wrapper为条件构造器
Mapper CRUD接口
通用CRUD封装BaseMapper接口,为MP启动时自动解析实体表关系映射
转换为Mybatis内部对象注入容器
泛型T为任意实体对象
参数Serializable为任意类型主键,MP不推荐使用符合主键约定每
一张表都有自己的唯一ID主键
对象Wrapper为条件构造器
5.条件构造器
--代码生成,CRUD操作
6.
MP视频学习:
1.通用Mapper
新增Create
新增方法
常用注解
Data
TableName("")
TableId
TableField
排除非表字段
关键字 transient 不能序列化
@TableField(exist=false)
查询Retrieve
基本查询方法
selectById
selectBatchIds
selectByMap
以条件构造器为参数的查询方法
QueryWrapper
apply
inSql
nested
select中字段不全出现的处理方法
条件构造器中的condition的作用
创建条件构造器时传入实体对象
条件构造器中allEq用法
其他以条件构造器为参数的查询方法
Lambda条件构造器
使用条件构造器的自定义sql
Mybatis分页介绍
MP分页插件实现物理分页
更新Update:
根据id更新
以条件构造器作为参数的更新方法
条件构造器中set方法使用
删除Delete:
根据id删除的方法
其他普通删除方法
以条件构造器为参数的删除方法
2.ActiveRecord模式:
AR探索:【通过实体类对象直接进行表的增删改查操作】
AR模式简介
MP中AR模式的实现
3.主键策略:
MP支持的主键策略介绍
局部主键策略实现
全局主键策略实现
4.MP配置
基本配置
进阶配置
DB策略配置
5.通用Service:
基本方法
批量操作方法
链式调用方法
进阶:
1.逻辑删除
逻辑删除简介
假删除
逻辑删除实现
查询中排除删除标识字段及注意事项
2.自动填充
自动填充简介
自动填充实现
自动填充优化
1.设置没有字段时不填充【一次管理多个表时使用】
2.已经设值了就不自动填充
3.乐观锁插件
简介:
1.取出记录时,获取当前version
2.更新时,带上这个version
3.版本正确更新成功,错误更新失败
功能实现:
实现步骤
注意事项
4.性能分析插件
性能分析实现
参数设置
执行sql分析打印 p6spy
5.多租户
多租户概念介绍
多租户实现
特定sql过滤
1.自定义过滤器
2.加注解 @SqlParser(filter = true)
6.动态表名SQL解析器
动态表名的应用场景
动态表名的实现
注意事项
7.SQL注入器
实现步骤:
1.创建定义方法的类
2.创建注入器
3.在mapper中加入自定义方法
选装件:
批量新增数据,自选字段insert
根据id逻辑删除数据,并带字段填充功能
根据id更新固定的某些字段
动态数据源:
https://dynamic-datasource.github.io/dynamic-datasource-doc/guide/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95
使用:
1.引入dynamic-datasource-spring-boot-starter。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
2.配置数据源
可通过自定义从数据库中动态查询获取
3.使用 @DS 切换数据源。
DS中可以使用spEL
velocity
Velocity语法包括:变量Variables,注释,属性Properties,if条件语句,foreach循环语句,
逻辑运算符,Parse导入脚本,带参数的宏等。
# 关键字
$ 变量
语法:
1.变量
(1)变量定义
#set($name = "velocity")
(2)变量的使用
${name}
${names}
(3)变量赋值
弱数据类型
#set($foo = ${bar})
2.循环
#foreach($element in $list)
This is $element
$velocityCount
#end
3.条件语句
#if(condition)
...
#elseif(condition)
...
#else
...
#end
4.关系操作符
&&
||
!
5.宏 可理解为函数定义
#macro(macroName arg1 arg2 ...)
...
#end
调用
#macroName(arg1 arg2 ...)
eg.
#macro(sayHello $name)
hello name
#end
#sayHello("velocity")
6.#parse 和 #include
解析
放入
Powered by Waline v2.15.5