Springboot整合Mybatis-plus,进行数据库操作
一:引入相关jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
二、application.yml配置:
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 开启驼峰命名
auto-mapping-behavior: full
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句
type-aliases-package: com.iflytek.product.productservice.modules.entity #实体类包
mapper-locations: classpath*:/com/iflytek/product/productservice/modules/mapper/xml/*Mapper.xml
global-config:
# 逻辑删除配置
db-config:
# 删除前
logic-not-delete-value: 1
# 删除后
logic-delete-value: 0
难点:mapper-locations的配置
classpath指目录到java或者resource
2.1. xml放在java目录下的,项目结构如图所示:
则
mapper-locations: classpath*:/com/iflytek/product/productservice/modules/mapper/xml/*Mapper.xml
2.2 xml放在resource目录下,项目结构如下图所示:
则:
mapper-locations: classpath*:mapper/xml/*Mapper.xm
三 、SpringBoot启动类上增加@MapperScan注解
备注:
@MapperScan 注解和 mybatis.mapper-locations 配置两者缺一不可
@MapperScan(basePackages=“xxx.xxx.xxx”) 这个注解是用户扫描 mapper 接口的,也就是dao类;
mybatis.mapper-locations 配置是用于扫描 mapper.xml 的;
两者用途不同,故缺一不可
四、Mybatis-plus简单使用
项目截图如图所示:
Mybatis-plus封装了单表的增删改查,因此单表可以用java代码简化操作,xml中不用写sql,service层和mapper层都可以,但xml文件还是要有的,如果是多表操作,就需要在xml中写sql
service层:
接口:
实现类:
dao层
Mapper接口
实体类:
- 实体类上不使用@TableName注解
这种情况,就需要实体类使用驼峰命名,表名由驼峰转化为中间加个横线命名,例如实体类ProductInfo, 数据库表名product_info,这种情况下mypatis-plus能进行单表的增删改查
eg:
数据库表名: product_info
实体类:
postman调用
当数据表名不是实体类中间加横线转化的,则不行,如图:
mybatis-plus就会找不到对应的表,此时实体类就需要使用@TableName注解
4.2 当数据库表名与实体类驼峰转化中间加横线对应获取的表名不一致时,使用@TableName注解使用
例如: 实体类ProductInfo,默认对应的表名product_info,而实际数据库表名为t_product_info
数据库表:
实体类:
postman调用:
4.2 数据库主键注解 @TableId
自增:
postman调试
4.3 实体类变量不是按照数据库字段驼峰命名时
主键:
非主键:
4.4 exist 表示是否为是数据库字段
在VO DTO的时候,经常会查询一些数据库中没有的字段,如果没有打上标签
那么查询会报错(如果实体类中的成员变脸在数据库中没有对应字段,可以视同)
需要设置为false
select 表示是否查询该字段
加上不参与查询,并且返回null
fill 表示是否自动填充
将对象存入数据的时候,由mybatisplus自动给某些字段赋值
应用场景
create_time update_time
比如说注册的时间和修改时间是基本上每个表都会用到的,实现起来就是获取时间存入,
但是就是烦
那么就交给mp来做 (采取以下配置,并且需要创建处理器)
DEFAULT --默认不处理
INSERT --插入时填充字段(第一次添加的时候)
INSERT_UPDATE --插入和更新时填充字段
(最近一次更新的时候,也就是插入和更新都满足)
UPDATE --更新时填充字段
创建自动填充处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 在插入的时候响应相关操作
* @param metaObject
*/
@Override
public void insertFill(org.apache.ibatis.reflection.MetaObject metaObject) {
/**
-
大意是将当前的时间赋值给字段名 也就是参数2 赋值给参数1 metaObject 可理解为当前传入对象
-
人话:就是给当前传入对象赋值
*/
setFieldValByName(“createTime”,new Date(),metaObject);
setFieldValByName(“updateTime”,new Date(),metaObject);
}/**
- 在插入的时候响应相关操作
- @param metaObject
*/
@Override
public void updateFill(org.apache.ibatis.reflection.MetaObject metaObject) {
setFieldValByName(“updateTime”,new Date(),metaObject);
}
}
@Version
标记乐观锁 -主修改操作
-防止数据被重复操作
-防止两个线程同时操作同一个数据,保证数据的安全性
原理:
标记乐观锁,通过version字段来保证数据的安全性,当修改数据的时候,
会以version作为条件,当条件成立的时候才会修改成功。
version=1
线程1: update … set version = 2 where version= 1
线程2: update … set version = 2 where version= 1
解释:
随便一条线程操作成功version 改为2 那么另一条线程就执行失败
环境搭建:
1.数据库添加version字段 默认值1
2.实体类添加version成员变量 天且添加@version
3.编写配置类
@Configuration
public class MyBatisPlusConfig {
/**
* @Configuration 加上就是配置类了
*
* @Bean 返回一个乐观锁拦截器的对象
*
* 大意就是会自动掉一个方法,然后通bean注解实例化对线,添加对象到IOC容器中
*/
@Bean
public OptimisticLockerInterceptor lockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
测试
同时修改情况 -感兴趣的可以试一下
@EnumValue
通用的枚举类注解,将数据库字段映射成实体类的枚举类型成员变量
意识:将枚举改成成员变量和数据库的字段映射起来,根据数据库字段的值找到对应枚举的对象
—第一种通过注解的方式
1.数据库添加状态字段
2.新建枚举类
加入字段 -需要注意,一定要和数据库字段映射起
在配置文件中配置枚举包扫描
测试查询
第二种通过实现接口的方式
插入操作变更
@TableLogic
映射逻辑删除
-
条件构造器
LambdaQueryWrapper使用
示例:
public ProductInfo selectByCode(String productCode) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProductInfo::getProductCode,productCode);
return productInfoMapper.selectOne(queryWrapper);
}
LambdaUpdateWrapper
LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PreInvestment::getId, id);
updateWrapper.eq(PreInvestment::getInvestmentState, CommonConstant.REVIEW_FLOW_STAGE_7).or().eq(PreInvestment::getInvestmentState, CommonConstant.REVIEW_FLOW_STAGE_9);
updateWrapper.eq(PreInvestment::getPrincipalCode, user.getUsername());
updateWrapper.set(PreInvestment::getDelFlag, CommonConstant.STATUS_0);
preInvestmentService.update(updateWrapper); -
Mybatis-plus分页配置
//Spring boot方式
@Configuration
@MapperScan(“com.baomidou.cloud.service..mapper”)
public class MybatisPlusConfig {// 旧版
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
}
参考文章:
Mybatis-plus官网:https://baomidou.com/pages/24112f/
Maven仓库地址: https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter/3.5.0
Mybatis-plus实体类注解使用:
https://blog.csdn.net/weixin_42526068/article/details/113039510
Mybatis-plus条件构造器
https://www.cnblogs.com/code-duck/p/13433809.html