基于Mybatis-plus 简化封装

原创 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

@Datapublic 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 插件化开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值