【MyBatis】MyBatisPlus的QueryWrapper扩展工具类

前言

MyBatisPlus很方便,可以使用QueryWrapper类直接构造条件进行数据库操作,但是构造条件时一般都需要为条件值做非空判断,如果条件很多,可能需要对大量条件进行非空判断,使得代码非常冗余并难以维护。

基于这类情况,编写了QueryWrapperX类,该类扩展了 MyBatis Plus 的 QueryWrapper,主要增加了 xxxIfPresent 系列方法(如 likeIfPresent、inIfPresent 等),这些方法在值存在时才拼接到查询条件中。这避免了不必要的条件拼接,提高了查询的准确性和性能。

/**
 * 拓展 MyBatis Plus QueryWrapper 类
 */
@SuppressWarnings("unused")
public class QueryWrapperX<T> extends QueryWrapper<T> {

    /**
     * 动态表生成规则实体
     * 动态生成表名时用到
     */
    @Getter
    @Setter
    private Object dynamicTableRule;

    public QueryWrapperX<T> likeIfPresent(String column, String val) {
        if (StringUtils.isNotEmpty(val)) {
            return (QueryWrapperX<T>) super.like(column, val);
        }
        return this;
    }

    public QueryWrapperX<T> inIfPresent(String column, Collection<?> values) {
        if (!CollectionUtils.isEmpty(values)) {
            return (QueryWrapperX<T>) super.in(column, values);
        }
        return this;
    }

    public QueryWrapperX<T> inIfPresent(String column, Object... values) {
        if (!ArrayUtils.isEmpty(values)) {
            return (QueryWrapperX<T>) super.in(column, values);
        }
        return this;
    }

    public QueryWrapperX<T> eqIfPresent(String column, Object val) {
        if (StringUtils.isNotEmpty(val)) {
            return (QueryWrapperX<T>) super.eq(column, val);
        }
        return this;
    }
    public QueryWrapperX<T> neIfPresent(String column, Object val) {
        if (StringUtils.isNotEmpty(val)) {
            return (QueryWrapperX<T>) super.ne(column, val);
        }
        return this;
    }

    public QueryWrapperX<T> gtIfPresent(String column, Object val) {
        if (StringUtils.isNotEmpty(val)) {
            return (QueryWrapperX<T>) super.gt(column, val);
        }
        return this;
    }

    public QueryWrapperX<T> betweenIfPresent(String column, Object start, Object end) {
        if (start != null && end != null) {
            return (QueryWrapperX<T>) super.between(column, start, end);
        }
        return this;
    }

    // ========== 重写父类方法,方便链式调用 ==========

    @Override
    public QueryWrapperX<T> eq(boolean condition, String column, Object val) {
        super.eq(condition, column, val);
        return this;
    }

    @Override
    public QueryWrapperX<T> eq(String column, Object val) {
        super.eq(column, val);
        return this;
    }

    @Override
    public QueryWrapperX<T> orderByDesc(String column) {
        super.orderByDesc(true, column);
        return this;
    }

    /**
     * 获取最一条数据 <br/>
     * 此方法需要在最后一步调用
     *
     * @return {@link QueryWrapperX <T>}
     */
    public QueryWrapperX<T> limit() {
        return limit(1);
    }

    /**
     * 获取最后几条数据 <br/>
     * 此方法需要在最后一步调用
     *
     * @param limitSize 数据量
     * @return {@link QueryWrapperX <T>}
     */
    public QueryWrapperX<T> limit(Integer limitSize) {
        if (limitSize == null) {
            limitSize = 1;
        }
        super.last("limit " + limitSize);
        return this;
    }

    @Override
    public QueryWrapperX<T> last(String lastSql) {
        super.last(lastSql);
        return this;
    }

}

使用示例:

    public CommonResult<List<FinenessPO>> listFineness(@RequestBody FinenessQuery finenessQuery) {
        QueryWrapperX<FinenessPO> queryWrapperX = new QueryWrapperX<>();
        queryWrapperX.eqIfPresent(FinenessTable.id, finenessQuery.id());
        queryWrapperX.likeIfPresent(FinenessTable.name, finenessQuery.getName());
        List<FinenessPO> result = finenessService.list(queryWrapperX);
        return CommonResult.ok(result);
    }
<think>好的,我需要帮助用户了解MyBatisPlus Wrapper工具类的使用方法和示例教程。首先,我应该回顾用户提供的引用内容,看看里面有没有相关的信息。引用[1]提到MyBatis-Plus的Wrapper使用教程和实例,引用[2]说明QueryWrapper的方法,引用[3]和[4]提到查询工具类扩展工具类,用于简化条件构造和非空判断。 用户的问题是关于Wrapper工具类的用法,可能包括基本使用、条件构造、链式调用、Lambda表达式以及工具类优化。我需要结合这些引用内容,分步骤解释使用方法,并给出代码示例。同时,按照用户的要求,使用中文回答,数学表达式用$...$,独立公式用$$...$$,不过这里可能数学公式不多,但要注意格式。 首先,Wrapper的主要作用是构建查询条件,比如eq、ne、like等方法。需要举例说明如何创建QueryWrapper实例,并添加条件。例如,查询年龄大于18的用户,代码示例中可能用到wrapper.gt("age", 18)。 然后,链式调用是Wrapper的特点,可以连续添加多个条件。例如,查询名字包含"张"且年龄在20到30之间的用户,用wrapper.like("name","张").between("age",20,30)。 Lambda表达式部分,使用LambdaQueryWrapper可以避免硬编码字段名,比如用LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>(); lqw.eq(User::getName, "张三")。这样更安全,减少错误。 工具类优化方面,引用[3]和[4]提到MybatisPlusQueryUtils和扩展工具类,用于处理非空判断。可以给出一个工具类示例,封装条件构建,避免重复代码。比如,如果参数不为空,才添加到条件中,减少冗余判断。 最后,生成相关问题,可能涉及性能优化、复杂条件构建、与分页结合使用等。需要确保问题与主题相关,并帮助用户进一步学习。 在写作过程中,要注意引用标记,比如在提到工具类时引用[^3]和[^4]。同时,确保代码示例正确,符合MyBatisPlus的语法,可能参考引用中的示例结构。需要检查是否有遗漏的要点,比如分页查询如何与Wrapper结合,这在引用[3]中提到过,可以加入示例。 总结步骤:介绍基本用法,链式调用,Lambda方式,工具类优化,分页示例,相关问题。确保每个部分都有代码示例,并正确引用来源。</think>### MyBatisPlus Wrapper工具类使用教程 MyBatisPlus的`Wrapper`工具类(如`QueryWrapper`、`LambdaQueryWrapper`)用于动态构建数据库操作条件,简化SQL拼接并提高代码可维护性。以下是详细使用方法及示例: --- #### 一、基本条件构造 通过`QueryWrapper`直接添加条件,支持`eq`(等于)、`gt`(大于)、`like`(模糊查询)等方法: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name", "张三") // name = '张三' .gt("age", 18) // age > 18 .like("email", "@test.com"); // email LIKE '%@test.com%' List<User> users = userMapper.selectList(wrapper); ``` --- #### 二、链式调用与复杂条件 支持`and`、`or`嵌套逻辑,结合`apply`处理复杂表达式: ```java wrapper.and(w -> w.lt("score", 60).or().isNull("status")) // (score < 60 OR status IS NULL) .apply("DATE(create_time) = {0}", "2023-10-01"); // 动态参数注入 ``` --- #### 三、Lambda表达式(类型安全) 使用`LambdaQueryWrapper`避免字段名硬编码,示例: ```java LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>(); lqw.eq(User::getRole, "admin") // role = 'admin' .ge(User::getSalary, 5000); // salary >= 5000 userMapper.selectList(lqw); ``` --- #### 四、工具类优化非空判断 通过工具类封装条件构建,减少冗余代码(引用[^3]): ```java public class QueryUtils { public static <T> QueryWrapper<T> buildQuery(String name, Integer age) { return new QueryWrapper<T>() .like(StringUtils.isNotBlank(name), "name", name) .gt(age != null, "age", age); } } // 调用示例 QueryWrapper<User> wrapper = QueryUtils.buildQuery("李", 25); List<User> users = userMapper.selectList(wrapper); ``` --- #### 五、结合分页查询 与`Page`对象配合实现分页(引用[^3]): ```java Page<User> page = new Page<>(1, 10); // 第1页,每页10条 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.orderByDesc("create_time"); IPage<User> userPage = userMapper.selectPage(page, wrapper); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值