原创 linchengdong 程序员果冻 2024年08月02日 15:39 广东
前言:
MyBatis-Plus 是一个功能强大的 MyBatis 增强工具包,旨在简化开发工作、提高生产率。它与 MyBatis 完全兼容,不改变 MyBatis 的使用方式,同时提供了一些高效的、开箱即用的特性,帮助开发者节省大量时间。具体参考官方文档 (https://baomidou.com/introduce/)
在公司开发使用过程中,我们经常发现需要构建大量的QueryWrapper, Page 对象,同时还需要针对page 的记录进行转换给前端。比如下面的代码随处可见
@Override
public PageResponse<SubAccountResponse> getListAccount(Integer page, Integer limit, Long userId) {
LambdaQueryWrapper<AgentAccount> query = new LambdaQueryWrapper<>();
query.eq(AgentAccount::getFkParent,userId);
Page<AgentAccount> pageParam = new Page<>(page,limit);
Page<AgentAccount> accountPage = this.page(pageParam, query);
List<SubAccountResponse> list = accountPage.getRecords().stream().map(agentAccount -> {
SubAccountResponse response = new SubAccountResponse();
response.setId(agentAccount.getId());
response.setUsername(agentAccount.getUsername());
response.setAccountType(agentAccount.getAccountType());
return response;
}).collect(Collectors.toList());
PageResponse<SubAccountResponse> response = new PageResponse<>();
response.setRecords(list);
response.setTotal(accountPage.getTotal());
return response;
}
-
query.eq(column,value) 这样的代码随处可见
-
同时响应给客户端的Page对象又需要转换,对整体的代码逻辑实际上很不友好
封装简化
1. 定义SimpleQuery抽象类
SimpleQuery 不需要分页的查询,自动帮忙构建排序规则
public abstract class SimpleQuery<T,K extends AbstractProtocol> extends AbstractQuery<T,K>{
public SimpleQuery(K body) {
super(body);
List<OrderItem> items = body.toSort();
if (CollectionUtil.isNotEmpty(items)) {
this.append(items);
}
}
}
2. 定于SimplePageQuery抽象类
SimplePageQuery 帮忙构建好了排序,分页条件构造器
public abstract class SimplePageQuery<T,K extends AbstractPageProtocol> extends AbstractQuery<T,K> {
private final K body;
protected Integer pageNo = 1;
protected Integer pageSize = 10;
public SimplePageQuery(K pageProtocol) {
super(pageProtocol);
this.body = pageProtocol;
this.pageNo = pageProtocol.getPageNo();
this.pageSize = pageProtocol.getPageSize();
// 自动构造查询
List<OrderItem> items = pageProtocol.toSort();
if (CollectionUtil.isNotEmpty(items)) {
append(items);
}
}
/**
* 返回 Page 对象用于mybatis-plus 的Page 查询 参数
* @return
*/
public Page<T> toPage() {
return new Page<>(pageNo,pageSize);
}
}
使用方式
假设有一个SysUser实体对象@Data
public class SysUserEntity extends BaseEntity {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String password;
private String fullname;
private String mobile;
private String email;
private StatusEnum status;
}
假设有一个需求需要针对username,password查询,不需要分页,同时需要按照用户名升序,id降序,fullname升序排序 那么定义一个查询对象继承AbstractProtocol
@Data
public class UsernameRequestProtocol extends AbstractProtocol {
@Query(column = "username")
private String name;
@Query(column = "password")
private String password;
}
定义具体的Query对象继承SimpleQuery
public class UserNameDefaultQuery extends SimpleQuery<SysUserEntity, UsernameRequestProtocol> {
private final UsernameRequestProtocol request;
public UserNameDefaultQuery(UsernameRequestProtocol request) {
super(request);
this.request = request;
}
}
使用端
简单查询不需要分页
@GetMapping("mybatis/query/default")
public SysUserEntity queryDefault() {
// 前端请求对象
UsernameRequestProtocol request = new UsernameRequestProtocol();
request.setName("admin");
request.setPassword("$2a$10$6ibeG2RhuSqQJfSj/XYgCe3TVZ8doHoQY580.NqESyaDWnHd5sZM6");
request.setOrder("username:asc,id:desc,fullname:asc");
UserNameDefaultQuery query = new UserNameDefaultQuery(request);
SysUserEntity userEntity = sysUserMapper.selectOne(query.toQueryWrapper());
return userEntity;
}
分页查询
@GetMapping("mybatis/query/page")
public UserPageResponse getByNamePage() {
UsernamePageRequestProtocol request = new UsernamePageRequestProtocol();
request.setName("admin");
request.setOrder("username:asc,id:desc,fullname:asc");
UsernamePageQuery query = new UsernamePageQuery(request);
Page<SysUserEntity> page = query.toPage();
Page<SysUserEntity> entityPage = sysUserMapper.selectPage(page, query.getQueryWrapper());
UserPageResponse pageResponse = new UserPageResponse(entityPage);
return pageResponse;
}
-
query.getQueryWrapper() 直接可以获取到QueryWrapper查询对象
-
query.toPage()直接可以获取到Page对象
springboot5
springboot · 目录
上一篇springboot优雅解决long类型导致精度丢失问题下一篇基于spring-plugin 插件化开发