基于Mybatis Plus实现多表分页查询

注意:Mybatis Plus 3.0.7 版本才开始用【自定义sql】+【QueryWrapper】,低版本不能使用,还是老实写SQL进行条件拼接

1、源码分析

Wrapper<T>接口中就有如下方法

/**
 * 获取自定义SQL 简化自定义XML复杂情况
 * 使用方法:自定义sql + ${ew.customSqlSegment}
 * 		1.逻辑删除需要自己拼接条件 (之前自定义也同样)
 * 		2.不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦)
 * 		3.用法 ${ew.customSqlSegment} (不需要where标签包裹,切记!)
 * 		4.ew是wrapper定义别名,可自行替换
 */
public abstract String getCustomSqlSegment();

AbstractWrapper抽象类中进行了实现

@Override
public String getCustomSqlSegment() {
    // MergeSegments 为 返回 合并 SQL 片段
    MergeSegments expression = getExpression();
    if (Objects.nonNull(expression)) {
        NormalSegmentList normal = expression.getNormal();
        String sqlSegment = getSqlSegment();
        if (StringUtils.isNotEmpty(sqlSegment)) {
            if (normal.isEmpty()) {
                return sqlSegment;
            } else {
                return concatWhere(sqlSegment);
            }
        }
    }
    return StringUtils.EMPTY;
}
/**
     * 拼接`WHERE`至SQL前
     *
     * @param sql sql
     * @return 带 where 的 sql
     */
private String concatWhere(String sql) {
    return Constants.WHERE + " " + sql;
}

2、案例讲解

2.1、dao

说明:
1、这里Dao层需要继承BaseMapper,泛型指定为查询实体;
2、@Mapper,这个无过多说明;
3、最重要的是方法形参@Param("ew") QueryWrapper<ReseEntity> queryWrapper,这里是使用mybatisplus的条件构造器(超链接进官方文档),【2.3、service】中有说明

@Mapper
public interface ReseDao extends BaseMapper<ReseEntity>  {
    /**
     * 分页查询
     * @param page:mybatisPlus 原生分页查询,查询SQL会自动拼接分页
     * @param queryWrapper:QueryWrapper条件,注意,这里需要使用 @Param("ew") 指定mybatis参数
     * @return
     */
    IPage<ReseEntity> getReseList(IPage<T> page, @Param("ew") QueryWrapper<ReseEntity> queryWrapper);
}

2.2、xml

说明:
1、查询SQL写完后,不用写【WHERE】,在SQL后面加入【 ${ew.customSqlSegment}】,mybatisPlus会自动将查询添加进行拼接

2、为什么是ew:mybatisPlus 之前有EntityWrapper,在后面版本将EntityWrapper分化为了多个Wrapper,例如查询的时候,就是QueryWrapper,猜测可能之前通过ew引用地方太多,保留了使用ew

<select id="getReseList" resultMap="reseMap">
    SELECT
        r.rese_id,
        r.rese_no,
        w.WORK_Name
    FROM
        t_s_db_rese r
        left join t_s_db_work w
        on r.WORK_id = w.WORK_id 
     ${ew.customSqlSegment}
</select>

2.3、service

说明:
1、getPage(params, null, false): 方法用来拼接mybatis plus 分页组件(超链接进官方文档)
2、getWrapper(params):方法用来拼接 QueryWrapper 条件构造器(超链接进官方文档)

/**
 * 分页查询
 * getPage(params, null, false): 方法用来拼接mybatis plus 分页组件的那个类
 * getWrapper(params):方法用来拼接 QueryWrapper 条件构造器
 */
@Override
public PageData<ReseDTO> page(Map<String, Object> params) {
    IPage<ReseEntity> page = reseDao.getReseList(
    		// 调用 分页组件返回 IPage对象
            getPage(params, null, false),
    		// 调用 条件构造器 返回 Wrapper
            getWrapper(params)
    );
    return getPageData(page, ReseDTO.class);
}

/**
* 查询条件:调用构造器
* @param params 查询条件,如果需要分页,则这个里面有分页参数
* @return
*/
private QueryWrapper<ReseEntity> getWrapper(Map<String, Object> params) {
   QueryWrapper<CarBrandEntity> wrapper = new QueryWrapper<>();
    /*
		eq 等于 =     参数说明:
			参数1、params.get("xxx") != null :如果不为null,则将eq添加到wrapper中;为null不添加
			参数2、w.WORK_Name,数据中的字段,多表查询指定要指定字段的表前缀
			参数3、params.get("xxx"),输入的查询添加
		若下面eq( )方法成立,添加在wrapper中,则查询SQL如下:
			SELECT r.rese_id, r.rese_no,  w.WORK_Name
    		FROM t_s_db_rese r
        	left join t_s_db_work w
        	on r.WORK_id = w.WORK_id 
		    where w.WORK_Name = "查询条件"
	*/
    wrapper.eq(params.get("xxx") != null, "w.WORK_Name", params.get("xxx"));

    return wrapper;
}

  /***
     * 分页查询
     * @param params  查询条件,主要是分页的(页码、显示内容、排序规则)
     * @param defaultOrderField 默认排序规则
     * @param isAsc 是否排序
     * @return
     */
public IPage getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
    long curPage = 1L;
    long limit = 20L;
    if (params.get(Constant.PAGE) != null) {
        curPage = Long.parseLong((String) params.get(Constant.PAGE));
    }
    if (params.get(Constant.LIMIT) != null) {
        limit = Long.parseLong((String) params.get(Constant.LIMIT));
    }

    Page page = new Page(curPage, limit);
 
    if (isAsc) {
        page.setAsc(new String[]{defaultOrderField});
     } else {
         page.setDesc(new String[]{defaultOrderField});
     }

    return page;
}

  • 25
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
您好!关于您的问题,我可以帮您解答。针对springboot整合mybatis-plus实现多表分页查询实现,可以按照以下步骤进行: 1.在pom.xml文件中添加Mybatis-Plus和Pagehelper的依赖,如下: ``` <!-- Mybatis-Plus依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> </dependency> <!-- Pagehelper依赖 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency> ``` 2.在Mybatis-Plus的配置文件中,指定分页插件。如下: ``` @Configuration @MapperScan("com.example.mapper") public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ``` 3.编写Mapper和对应的Mapper.xml文件,进行多表联合查询,并在Mapper接口方法上添加分页参数。如下: ``` //在Mapper接口方法上添加分页参数 public interface UserMapper extends BaseMapper<User> { List<User> selectUserPage(Page<User> page); } <!-- 在Mapper.xml中编写多表联合查询SQL语句 --> <select id="selectUserPage" resultMap="BaseResultMap"> select u.*, r.role_name from user u left join user_role ur on u.id = ur.user_id left join role r on ur.role_id = r.id <where> <if test="username != null and username != ''"> and u.username like concat('%',#{username},'%') </if> </where> </select> ``` 4.在Controller层中,接受分页参数并返回分页结果。如下: ``` @RestController public class UserController { @Autowired private UserMapper userMapper; @GetMapping("/users") public Page<User> selectUserPage(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size, String username) { Page<User> p = new Page<>(page, size); p = userMapper.selectUserPage(p, username); return p; } } ``` 以上就是整合Mybatis-Plus和Pagehelper实现多表分页查询的具体步骤,希望能对您有所帮助!如果您有其他问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值