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 实现注解式多表分页查询,如有更好的方式或者方法欢迎大家评论指出,谢谢。

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 实现注解式多表分页查询,如有更好的方式或者方法欢迎大家评论指出,谢谢。