Mybatis Plus 基于注解的多表分页查询

前言

Mybatis Plus 提供的基础分页查询只能满足单表,不足以支持多表,如果想要多表关联查询并且分页的话只能自己手动实现sql,今天就给大家介绍一下如何快速的基于注解方式实现多表分页查询。

实现方案

无非就是自己手动拼写sql并交付给Mybatis Plus 管理,下面直接上代码。

public interface CustomizeQueryMapper extends BaseMapper<CustomizeEntity> {
    String querySql = "SELECT a.*, b.role_name FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id ";
    String wrapperSql = "SELECT * from ( " + querySql + " ) AS q ${ew.customSqlSegment}";
    
    /**
     * 分页查询,不支持条件查询
     */
    @Select(wrapperSql)
    List<CustomizeEntity> list(@Param("ew") Wrapper queryWrapper);
    
    /**
     * 分页查询,支持Mybatis Plus条件查询
     */
    @Select(wrapperSql)
    Page<CustomizeEntity> pageList(Page page, @Param("ew") Wrapper queryWrapper);


    /**
     * 基础查询,注意是查询一条,需控制查询条件
     */
    @Select(wrapperSql)
    CustomizeEntity findOne(@Param("ew") Wrapper queryWrapper);
}

注意:如表表字段不一致且字段与实体可以一一对应,使用这种方式没有问题,如果表字段不一致,例如:

SELECT a.*, b.role_name as userRoleName FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id 

则查询时需使用别名查询:

QueryWrapper qw = new QueryWrapper();

qw.lambda().eq("q.userRoleName",customizeEntity.getUserRoleName);
重点要点
  1. 以上实现方式的关键在于 ${ew.customSqlSegment},这样写可以使用 Mybatis Plus 自身的 QueryWrapperLambdaQueryWrapper 等查询器输出查询 sql

  2. 在自定义sql种不可出现where,如想使用请在最外层包装一下,类似于我这样在最外层包装了一个临时表 q ,即可以使用自定义Where条件也可使用 Mybatis Plus 自身的查询条件

  3. 返回实体必须与自定义mapper种的泛型实体一致,否则会报类型不匹配,例如

    public interface UserRoleMapper extends BaseMapper<UserRoleEntity> {
        String querySql = "SELECT a.*, b.role_name FROM t_user AS a LEFT JOIN t_user_role AS b ON b.u_id = a.id ";
        String wrapperSql = "SELECT * from ( " + querySql + " ) AS q ${ew.customSqlSegment}";
        
        @Select(wrapperSql)
        CustomizeEntity findOne(@Param("ew") Wrapper queryWrapper);
    }
    

    BaseMapper<UserRoleEntity> 与返回值CustomizeEntity不匹配。

  4. 虽然 Mybatis Plus 提供了 @TableField(exist = false) 来区分是否为数据库字段注解,但还是建议自定义查询单独创建Mapper及响应实体。

总结

以上为本次为大家带来的Mybatis Plus 实现注解式多表分页查询,如有更好的方式或者方法欢迎大家评论指出,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值