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

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

1、源码分析

Wrapper接口中就有如下方法

/**
 * 获取自定义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 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;
}

你可能感兴趣的:(java)