当前位置: 首页 > article >正文

mybatis自定义复杂条件拼接

  1. 定义条件对象
/**
 * @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. 定义查询对象
/**
 * @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. 查询条件枚举
/**
 * 操作符
 */
@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. 查询关系枚举
/**
 * 关联运算符
 */
@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
    <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>

http://www.kler.cn/a/287567.html

相关文章:

  • 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--完善TODO标记的代码
  • [ 网络安全介绍 3 ] 网络安全事件相关案例有哪些?
  • Zotero 7本地pdf文件名自适应中英文格式
  • Android加载pdf
  • 2024-11-16 串的存储结构
  • 【HAProxy09】企业级反向代理HAProxy高级功能之压缩功能与后端服务器健康性监测
  • element-ui 表单Cannot read property ‘indexOf‘ of undefined
  • 智能体与在线实用工具:协同并进,提升生活效率
  • 安达发|户外设备制造APS排程的多层级BOM订单拉动
  • 逆向中的游戏-入土为安的第二十五天
  • matlab2024a/2023/2022/2020/matlab2019 如何plot画局部放大图(已解决)
  • Redis的内存淘汰策略—— volatile-random
  • unity的语言问题记录(委托相关)
  • 《从C/C++到Java入门指南》- 26.record 类+多态
  • python 字典怎么提取value
  • 测试框架到底是什么,如何定义?
  • 安防管理平台工业排污检测视频智能分析工业排污检测算法源码全套方案
  • Java项目: 基于SpringBoot+mysql网上订餐系统分前后台(含源码+数据库+开题报告+PPT+毕业论文)
  • Electron基础(一) 实现最大化、最小化、关闭窗口功能
  • node.js使用express框架实现api接口开发(从零开始,超简单可直接复制)
  • ES6中js文件执行顺序
  • 第二证券:两市成交不足5000亿元 小盘成长股逆势活跃
  • 1秒等于1000毫秒, 1毫秒等于1000微秒,1微秒等于1000纳秒
  • Node.js中sqlite3的db.run、db.get和db.all方法深入解析
  • 区块链媒体套餐发稿:世媒讯引领项目推广新风潮
  • ARM体系结构