基于Mybatis Plus实现多表分页查询的示例代码

网友投稿 1571 2023-03-05

基于Mybatis Plus实现多表分页查询的示例代码

基于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 {

/**

* 分页查询

* @param page:mybatisPlus 原生分页查询,查询SQL会自动拼接分页

* @param queryWrapper:QueryWrapper条件,注意,这里需要使用 @Param("ew") 指定mybatis参数

* @return

*/

IPage getReseList(IPage page, @Param("ew") QueryWrapper queryWrapper);

}

2.2、xml

说明:

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

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

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}

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 page(Map params) {

IPage page = reseDao.getReseList(

// 调用 分页组件返回 IPage对象

getPage(params, null, false),

// 调用 条件构造器 返回 Wrapper

getWrapper(params)

);

return getPageData(page, ReseDTO.class);

}

/**

* 查询条件:调用构造器

* @param params 查询条件,如果需要分页,则这个里面有分页参数

* @return

*/

private QueryWrapper params) {

QueryWrapper 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 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;

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue3能开发小程序吗(vue可以用来开发微信小程序么)
下一篇:Mybatis查询时,区分大小写操作
相关文章

 发表评论

暂时没有评论,来抢沙发吧~