通过IDEA基于springboot配置使用mybatis-plus
MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在。
首先需要在IDEA中安装Mybatis-pius的插件
然后在Maven中导入依赖
pom.xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
配置完成,就是这么简单
相关类要继承mybatis-plus的baseXXX类
model:
@TableName("examinee_info")
public class ExamineeInfo extends BaseModel {
private static final long serialVersionUID = 1L;
@TableField("card_id")
private String cardId;
}
常用注解:
@TableName 】
@TableName 用于定义表名
注:
常用属性:
value 用于定义表名
【@TableId】
@TableId 用于定义表的主键
注:
常用属性:
value 用于定义主键字段名
type 用于定义主键类型(主键策略 IdType)
主键策略:
IdType.AUTO 主键自增,系统分配,不需要手动输入
IdType.NONE 未设置主键
IdType.INPUT 需要自己输入 主键值。
IdType.ASSIGN_ID 系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)。
IdType.ASSIGN_UUID 系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)。
【@TableField】
@TableField 用于定义表的非主键字段。
注:
常用属性:
value 用于定义非主键字段名
exist 用于指明是否为数据表的字段, true 表示是,false 为不是。
fill 用于指定字段填充策略(FieldFill)。
字段填充策略:(一般用于填充 创建时间、修改时间等字段)
FieldFill.DEFAULT 默认不填充
FieldFill.INSERT 插入时填充
FieldFill.UPDATE 更新时填充
FieldFill.INSERT_UPDATE 插入、更新时填充。
【@TableLogic】
@TableLogic 用于定义表的字段进行逻辑删除(非物理删除)
注:
常用属性:
value 用于定义未删除时字段的值
delval 用于定义删除时字段的值
【@Version】
@Version 用于字段实现乐观锁
Mapper:
public interface ExamineeInfoMapper extends BaseMapper<ExamineeInfo> {
}
service:
@Service
public class ExamineeInfoService extends BaseService<ExamineeInfoMapper, ExamineeInfo> {
}
controller:
@Controller
public class ExamineeInfoController extends BaseController<ExamineeInfoService, ExamineeInfo, ExamineeInfoMapper> {
}
mybatis-plus封装了大量方法
操作mybatis-plus的重点就是条件构造器QueryWrapper
例如
@PostMapping("/myUpdate")
public ResponseWrapper myUpdate(@RequestBody ExamineeSubmitReview examineeSubmitReview){
examineeSubmitReview.setExamineeReviewFormUrl(null);
return ResponseWrapper.success(examineeSubmitReviewService.update(examineeSubmitReview,new QueryWrapper<ExamineeSubmitReview>().eq(ExamineeSubmitReview.EXAMINEE_ID,examineeSubmitReview.getExamineeId())));
}
难点 and 嵌套:
ExamineeInfo examineeInfo = examineeInfoMapper.selectOne(
new QueryWrapper<ExamineeInfo>().eq(ExamineeInfo.ID, examineeSubmitReview.getExamineeId())
.and(params.getExamineeName()!=null,
Wrapper->Wrapper.like(ExamineeInfo.CARD_ID,params.getExamineeName())
.or()
.like(ExamineeInfo.PHONE_NUMBER,params.getExamineeName())
.or()
.like(ExamineeInfo.EXAMINEE_NAME,params.getExamineeName())
)
);
Mybatis-Plus分页
配置分页插件。
编写一个 配置类,内部使用 @Bean 注解将 PaginationInterceptor 交给 Spring 容器管理。
@EnableTransactionManagement
@Configuration
@MapperScan("com.cvit.emb_archives.dao")
public class MybatisPlusConfig {
/**
* 分页插件 攻击 SQL 阻断解析器 多租户 SQL 解析器
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
例如
public Map pageList(ExamineeInfo params, PageRequest pageInfo){
Map map=new HashMap(16);
List<ExamineeInfo> infoList=new ArrayList<>();
Page page=new Page(pageInfo.getPageIndex(),pageInfo.getPageSize());
Page page1=examineeSubmitReviewMapper.selectPage(page,
new QueryWrapper<ExamineeSubmitReview>().ne(ExamineeSubmitReview.EXAMINEE_OPERATION_TRANSCRIPT_URL," ")
.and(wrapper->wrapper.ne(ExamineeSubmitReview.EXAMINEE_THEORY_RECORD_FORM_URL," ")
)
);
List<ExamineeSubmitReview> reviewList=page1.getRecords();
for(ExamineeSubmitReview examineeSubmitReview:reviewList) {
ExamineeInfo examineeInfo = examineeInfoMapper.selectOne(
new QueryWrapper<ExamineeInfo>().eq(ExamineeInfo.ID, examineeSubmitReview.getExamineeId())
.and(params.getExamineeName()!=null,
Wrapper->Wrapper.like(ExamineeInfo.CARD_ID,params.getExamineeName())
.or()
.like(ExamineeInfo.PHONE_NUMBER,params.getExamineeName())
.or()
.like(ExamineeInfo.EXAMINEE_NAME,params.getExamineeName())
)
);
if(examineeInfo!=null)infoList.add(examineeInfo);
}
map.put("records",infoList);
map.put("total",page1.getTotal());
return map;
}
乐观锁的实现
配置乐观锁插件。
编写一个配置类(可以与上例的分页插件共用一个配置类),将 OptimisticLockerInterceptor 通过 @Bean 交给 Spring 管理。
/*
*
* 乐观锁实现方式:
*
* 取出记录时,获取当前version
* 更新时,带上这个version
* 执行更新时, set version = newVersion where version = oldVersion
* 如果version不对,就更新失败
* 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
* 仅支持 updateById(id) 与 update(entity, wrapper) 方法
* 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}