好用的mybatis-plus
前言
最近参加了公司的新项目,leader技术比我厉害多了。mybatis-plus简称mp。
之前没使用过mp,刚开始感觉很不适应,稍微接触后,感觉真的很省事。可以少些很多代码哦。
故,在此记录使用mybatis-plus的用法,
也可参考mp官网:https://baomidou.com/guide/
稍微说下我对mp使用场景的理解
mp的使用场景:针对单表的简单CRUD,将常用的列表查询,批量新增
mp不支持的场景:mp不支持联表查询。
1.mp需要的前置工作
导入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
application.properties增加mapper.xml路劲
#填写mybatis的mapper书写路径
mybatis.mapper-locations=classpath:mapper/*/*.xml
分页查询插件
//Spring boot方式
@EnableTransactionManagement
@Configuration
@MapperScan({"com.example.demo.**.dao","com.example.demo.**.**.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 MySqlInjector sqlInjector() {
return new MySqlInjector();
}
}
/**
* 自定义Sql注入
*
* @author nieqiurong 2018/8/11 20:23.
*/
public class MySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
/**
* 以下 3 个为内置选装件
* 头 2 个支持字段筛选函数
*/
// 例: 不要指定了 update 填充的字段
// methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
methodList.add(new InsertBatchSomeColumn());
methodList.add(new AlwaysUpdateSomeColumnById());
methodList.add(new LogicDeleteByIdWithFill());
return methodList;
}
}
2.先从对象开始
@Data
@TableName("t_book_info")
public class BookInfoModel extends BaseModel {
/**
* 书名
* @JsonInclude是fastJosn的注解
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
// @TableField(fill = FieldFill.INSERT,exist = false)
private String bookName;
/**
* 价格
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private BigDecimal bookPrice;
/**
* 作者
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String bookAuther;
/**
* 类别(1-童书,2-文学,3-教辅,4-经管投资,5-社科,6-科技,7-生活育儿,8-艺术,9-动漫,10-其他)
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String bookType;
/**
* 珍本标识(rare-珍本,unra-非珍本)
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String rareFlag;
/**
* 借阅次数
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private Long borrowTimes;
/**
* 借阅标识(in-未借出,out-已借出)
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String borrowFlag;
/**
* 遗失标志(0-未遗失,1-遗失)
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String loseFlag;
/**
* 出版社
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String press;
/**
* 出版时间
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private Date pressDate;
/**
* 备注
**/
@JsonInclude(JsonInclude.Include.NON_NULL)
private String remark;
@JsonInclude(JsonInclude.Include.NON_NULL)
//该字段不在t_book_info表内
@TableField(exist=false)
//private List<BorrowBookModel> borrowList;
}
3.Mapper层(也称为Dao)
@Mapper
@Repository
public interface BookInfoDao extends BaseMapper<BookInfoModel> {
}
4.service层和impl
public interface BookInfoService extends IService<BookInfoModel> {
}
@Slf4j
@Service
public class BookInfoServiceImpl extends ServiceImpl<BookInfoDao,BookInfoModel> implements BookInfoService {
}
5.controller层
@Slf4j
@RestController
@RequestMapping(value = "bookInfo")
public class BookInfoController {
//按类型装配
@Autowired
private BookInfoService bookInfoService;
/**
* @Author longtao
* @Date 2020/11/24
* @Describe 调用IService的save接口实现insert 不需要写sql和mapper.xml
**/
@BaseBeforeAnnotation
@RequestMapping("insertOne")
public BaseResponse insertBoookInfo(@RequestBody BookInfoModel model) {
Boolean flag = bookInfoService.save(model);
if (flag) {
return new BaseResponse(ResultEnum.SUCCESS);
}
return new BaseResponse(ResultEnum.FAIL);
}
/**
* @Author longtao
* @Date 2020/11/24
* @Describe 调用IService的update接口实现update 更新指定字段,忽略其他字段
* .set 相当于 set book_name = #{boonName}
* .eq 相当于 where id = #{id}
**/
@BaseBeforeAnnotation
@RequestMapping("updateOne")
public BaseResponse updateBookInfo(@RequestBody BookInfoModel model) {
Boolean flag = bookInfoService.update(new UpdateWrapper<BookInfoModel>()
.lambda()
.set(BookInfoModel::getBookName, model.getBookName())
.eq(BookInfoModel::getId, model.getId())
);
if (flag) {
return new BaseResponse(ResultEnum.SUCCESS);
}
return new BaseResponse(ResultEnum.FAIL);
}
/**
* @Author longtao
* @Date 2020/11/24
* @Describe mybatis 调用IService的saveOrUpdate接口实现简单的新增或更新 根据主键id判断
* 如果主键id存在,更新model中不为null的字段
* 如果主键id不存在,插入一条新的数据
**/
@BaseAroundAnnotation
@RequestMapping("saveOrUpdate")
public BaseResponse saveOrUpdate(@RequestBody BookInfoModel model) {
//saveOrUpdate 内部逻辑 !StringUtils.checkValNull(idVal) && !Objects.isNull(this.getById((Serializable)idVal)) ? this.updateById(entity) : this.save(entity)
Boolean flag = bookInfoService.saveOrUpdate(model);
return new BaseResponse(ResultEnum.SUCCESS, flag);
}
/**
* @Author longtao
* @Date 2020/11/24
* @Describe mybatis 调用IService的getOne接口实现简单的查询
* 如果主键id存在,更新model中不为null的字段
* 如果主键id不存在,插入一条新的数据
**/
@BaseBeforeAnnotation
@RequestMapping("selectOne")
public BaseResponse selectBookInfo(@RequestBody BookInfoModel model) {
BookInfoModel bookInfoModel = bookInfoService.getOne(new QueryWrapper<BookInfoModel>()
.lambda()
.eq(BookInfoModel::getId, model.getId())
);
return new BaseResponse(ResultEnum.SUCCESS, bookInfoModel);
}
/**
* @Author longtao
* @Date 2020/11/24
* @Describe mybatis mp自带的分页接口,不需要写sql即可实现分页查询
* 分页必须实例化PaginationInterceptor,见1.准备工作里的MybatisPlusConfig
**/
@BaseAroundAnnotation
@RequestMapping("selectBookInfoByWrapper")
public BaseResponse selectBookInfoByWrapper(@RequestBody BookInfoModel model) {
Page<BookInfoModel> page = new Page<BookInfoModel>(model.getPageNo(), model.getPageSize());
//计数
Integer count = bookInfoService.count(new QueryWrapper<BookInfoModel>()
.lambda()
.eq(BookInfoModel::getLoseFlag, LoseFlagEnum.UN_LOSE.getCode())
);
//数据
IPage<BookInfoModel> list = bookInfoService.page(page, new QueryWrapper<BookInfoModel>()
.lambda()
.eq(BookInfoModel::getLoseFlag, LoseFlagEnum.UN_LOSE.getCode())
.like(BookInfoModel::getBookName,"php")
.eq(BookInfoModel::getBookName,"php+").or().eq(BookInfoModel::getBookName,"php-")
.orderByDesc(BookInfoModel::getCreateTime)
);
return new BaseResponse(ResultEnum.SUCCESS, count, list.getRecords());
}
}