mybatis自定义复杂条件拼接

  1. 定义条件对象
java 复制代码
/**
 * @description:
 * @author: yilv
 * @create: 2024-08-26 17:35
 **/
@Data
public class ComplexQueryDto {
    /**
     * 查询参数
     */
    private List<QueryDto> params=new ArrayList<>();

    public ComplexQueryDto addParam(QueryDto queryDto){
        this.params.add(queryDto);
        return this;
    }
}
  1. 定义查询对象
java 复制代码
/**
 * @description: 通用查询对象
 * @author: yilv
 * @create: 2024-08-26 17:42
 **/
@Data
@Accessors(chain =true)
public class QueryDto {
    /**
     * 字段名
     */
    private String filedName;

    /**
     * 比较运算符
     */
    private String opt;

    /**
     * 单值
     */
    private String filedValue;

    /**
     * 多值集合
     */
    private String[] filedValues;
    /**
     * 关系符
     */
    private String rel;
}
  1. 查询条件枚举
java 复制代码
/**
 * 操作符
 */
@Getter
public enum QueryOpt {
    //非空
    NOT_NULL("IS NOT NULL"),
    //包含")
    IN("IN"),
    //不包含")
    NOT_IN("NOT IN"),
    //存在")
    LIKE("LIKE"),
    //不存在")
    NOT_LIKE("NOT LIKE"),
    //等于")
    EQ("="),
    //不等于")
    NE("!="),
    //大于")
    GT(">"),
    //大于等于")
    GE(">="),
    //小于")
    LT("<"),
    //小于等于")
    LE("<="),
    //范围")
    BETWEEN("BETWEEN");
    private final String seg;

    public String getSeg() {
        return seg;
    }

    QueryOpt(String seg) {
        this.seg = seg;
    }
}
  1. 查询关系枚举
java 复制代码
/**
 * 关联运算符
 */
@Getter
public enum QueryRel {
    //与")
    AND("AND"),
    //或")
    OR("OR"),
    //非")
    NOT("NOT");
    private final String seg;

    public String getSeg() {
        return seg;
    }

    QueryRel(String seg) {
        this.seg = seg;
    }
}
  1. 编写条件拼接SQL
xml 复制代码
    <sql id="complexQuery">
        <if test="params != null and params.size() != 0">
            <foreach item="param" index="index" collection="params">
                AND ${param.filedName} ${param.opt}
                <if test="param.opt == 'BETWEEN'">#{param.filedValues[0]} AND #{param.filedValues[0]}</if>
                <if test="param.opt == 'IN'||param.opt == 'NOT IN'">
                    <foreach item="filedValue" index="index" collection="param.filedValues" open="(" separator="," close=")">
                        #{filedValue}
                    </foreach>
                </if>
            </foreach>
        </if>
    </sql>


    <select id="??Query" resultMap="??">
        SELECT
        <include refid="div_Column_List"></include>
        FROM
        <include refid="table"></include>
        <include refid="complexQuery"></include>
    </select>
相关推荐
WeiQ_3 小时前
解决phpstudy 8.x软件中php8.2.9没有redis扩展的问题
数据库·redis·缓存
DashVector7 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
KYGALYX8 小时前
在Linux中备份msyql数据库和表的详细操作
linux·运维·数据库
檀越剑指大厂8 小时前
金仓KReplay:定义数据库平滑迁移新标准
数据库
努力成为一个程序猿.9 小时前
【Flink】FlinkSQL-动态表和持续查询概念
大数据·数据库·flink
kali-Myon9 小时前
NewStarCTF2025-Week4-Web
sql·安全·web安全·php·ctf·ssti·ssrf
毕设十刻9 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
liliangcsdn10 小时前
如何利用约束提示优化LLM在问题转sql的一致性
数据库·sql
Java爱好狂.11 小时前
分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
java·数据库·分布式·分布式id·es·java面试·java程序员