springboot2.3整合mybatis-plus⾼级功能及⽤法详解—学习并使⽤mybatis-plus的⼀些⾼级功能的⽤法例如: AR模式、乐观锁、逻辑删除、⾃动填充、数据保护等功能
为了⽅便演⽰,咱们还是新建⼀个全新的项⽬
引⼊mp依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
yml配置
# 配置端⼝
server:
port: 8080
spring:
# 配置数据源
datasource:
driver-class-name: sql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis-plus?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: root
password: root
# mybatis-plus相关配置
mybatis-plus:
# 以下配置均有默认值,可以不设置
global-config:
db-config:
#主键类型 auto:"数据库ID⾃增"
id-type: auto
configuration:
# 是否开启⾃动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
map-underscore-to-camel-case: true
# 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
call-setters-on-nulls: true
# 这个配置会将执⾏的sql打印出来,在开发或测试的时候可以⽤
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在 Spring Boot 启动类中添加@MapperScan注解,扫描 Mapper ⽂件夹
(⼀)AR模式使⽤
ActiveRecord模式:⽀持 ActiveRecord 形式调⽤,实体类只需继承 Model 类即可进⾏强⼤的 CRUD 操作
即直接使⽤实体类 CRUD操作
1.继承Model
点进Model 类中,发现其提供了⼀些基础的CRUD操作⽅法,并实现了序列化接⼝
注意的是,如果要使⽤ActiveRecord模式,仅仅继承Model 是不⾏的,这⼀点官⽹没有很显⽰的提到,还需要编写mapper接⼝继承BaseMapper接⼝,泛型为当前实体类2.mapper接⼝
如果不编写Mapper直接使⽤Model⽅法会报错:
那么,咱们来编写mapper
再次测试
3.CRUD操作
新增操作
查询操作
修改操作
删除操作
此AR模式呢,可以在开发中减少我们很多的调⽤代码,简单操作⽆需额外使⽤Mapper、service调⽤!
(⼆)乐观锁
使⽤Mybatis-plus实现乐观锁
乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别⼈不会修改,所以不会上锁,但是在更新的时候会判断⼀下在此期间别⼈有没有去更新这个数据,乐观锁适⽤于多读的应⽤类型,这样可以提⾼吞吐量。
mybatis-plus 提供的乐观锁是采⽤了版本号机制
数据表中加上⼀个数据版本号version字段,表⽰数据被修改的次数,当数据被修改时,version值会加⼀。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
mp项⽬使⽤乐观锁是使⽤其插件配置–配置Bean的形式
1.bean配置
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
2.实体类以及数据库添加对应字段以及列
@Version
private Integer version;
springboot aop⾄于version初始值,可以数据库默认设置为0,也可以再新增数据时⼿动设置verion版本号,个⼈是采⽤了数据库默认值
那么我们在做任何查询修改删除的时候呢,mp会默认帮我们吧版本号作为条件带上,判断与数据库中该数据版本号是否⼀致。
3.相关操作以及注意事项
⾸先插⼊⼀条数据
查询并修改该条信息
发现其在修改的时候,将version作为了条件,并对version做了修改 set操作(默认是在原基础上+1)
需要注意的⼏个点:
⽀持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
整数类型下 newVersion = oldVersion + 1
newVersion 会回写到 entity 中
仅⽀持 updateById(id) 与 update(entity, wrapper) ⽅法
在 update(entity, wrapper) ⽅法下, wrapper 不能复⽤
什么意思呢,就是要想使⽤乐观说,⾸先类型有限制,其次,修改⽅法仅仅只有上⽅两个有效,才会在修改时候对版本号就⾏修改操作以及要想版本号升级必须是要把之前版本号传过去。即version操作时,我必须把旧的带过去
版本号不对,是⽆法进⾏数据更新操作的(删除、修改)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论