java文件mybatis动态sql-where条件拼接-多种比较

String QUERY_WHERE_SQL = " where 1=1  " +
        //直接等于
        "<if test='source!=null and source!=\"\" '>" +
        " AND t.source = #{source} " +
        "</if>" +
        //字符串转日期
        "<if test='dateStart!=null and dateStart!=\"\" '>" +
        " AND t.date &gt;= STR_TO_DATE(#{dateStart}, '%Y-%m-%d %H:%i:%s') " +
        "</if>" +
        "<if test='dateEnd!=null and dateEnd!=\"\" '>" +
        " AND t.date &lt;= STR_TO_DATE(#{dateEnd}, '%Y-%m-%d %H:%i:%s') " +
        "</if>"  +
        //大小比较
        "<if test='score!=null and score!=\"\" '>" +
            "<if test='score &gt;= 0 '>" +
                " AND t.score &gt;= 0 " +
            "</if>" +
            "<if test='score &lt; 0 '>" +
                " AND t.score &lt; 0 " +
            "</if>" +
        "</if>" +
        //模糊比较
        "<if test='searchWord!=null and searchWord!=\"\" '>" +
        " AND t.title like CONCAT('%',#{searchWord},'%') " +
        "</if>" ;

 

ps:持续更新

### MyBatis-Plus 中动态构建 SQL 查询 在 Spring Boot 项目中整合 MyBatis-Plus 后,可以通过多种方式实现 SQL 语句的动态拼接MyBatis-Plus 支持通过 `Wrapper` 类及其子类来动态构建查询条件,这些类提供了丰富的 API 方法用于创建灵活多变的 SQL 语句。 #### 使用 QueryWrapper 实现基本的动态查询 对于简单的实体属性匹配场景,可以直接利用 `QueryWrapper` 进行条件组装: ```java // 创建一个 User 对象作为查询条件载体 User userCond = new User(); userCond.setName("张三"); // 初始化 QueryWrapper 并传入 entity 参数 QueryWrapper<User> queryWrapper = new QueryWrapper<>(userCond); // 添加额外的查询条件 queryWrapper.eq("age", 20).gt("score", 85); ``` 上述代码会生成类似于 `"SELECT * FROM user WHERE name='张三' AND age=20 AND score > 85"` 的 SQL 语句[^4]。 #### 利用 Lambda 表达式简化字段访问 为了防止硬编码列名带来的风险并提升开发体验,推荐采用带有泛型支持的 `LambdaQueryWrapper`: ```java LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.like(User::getName, "李").lt(User::getAge, 30); ``` 这段逻辑最终会被转换成类似 `"SELECT * FROM user WHERE name LIKE '%李%' AND age < 30"` 的表达形式。 #### 复杂条件下组合多个 Wrapper 实例 当面对更为复杂的业务需求时,比如需要同时满足若干组独立又相互关联的过滤规则,则可通过嵌套的方式将不同类型的 `Wrapper` 组合起来使用: ```java List<Integer> ids = Arrays.asList(1, 2, 3); QueryWrapper<User> wrapper = Wrappers.<User>query() .inSql("id", String.join(",", ids)) .and(i -> i.ge("create_time", startDate) .or().le("update_time", endDate)); ``` 这里展示了如何在一个查询里混合运用时间范围和其他特定 ID 集合来进行筛选。 #### 动态控制 SQL 片段可见性 除了常规的等于、大于小于比较外,有时还需要根据实际情况决定某些部分是否加入到最终执行的 SQL 文本之中。此时可借助于 `apply()` 函数配合 Java 内联函数特性完成此目的: ```java String customCondition = "status IN ('active', 'pending')"; QueryWrapper<User> dynamicWrapper = new QueryWrapper<>(); dynamicWrapper.apply(StringUtils.isNotBlank(customCondition), customCondition); ``` 如果变量 `customCondition` 不为空字符串的话,那么这部分就会被追加至整体查询串内;反之则忽略不计。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值