实用指南:MyBatis 的动态 SQL

news/2025/10/5 14:32:53/文章来源:https://www.cnblogs.com/wzzkaifa/p/19126571
1. 动态 SQL 的定义

动态 SQL 是 MyBatis 的核心特性之一,它允许开发者根据运行时条件动态生成 SQL 语句。通过特殊的 XML 标签或注解语法,实现 SQL 的灵活拼接,避免在 Java 代码中手动拼接 SQL 字符串的复杂性和安全风险。

2. 核心作用
  • 条件分支:根据参数值动态包含/排除 SQL 片段(如 WHERE 条件过滤)。

  • 循环处理:遍历集合生成批量操作(如 IN 查询、批量插入)。

  • 智能语法处理:自动去除多余的 AND/OR 或逗号,保证 SQL 语法正确性。

  • 防止 SQL 注入:通过参数占位符(#{})预编译 SQL。

3. 常用标签详解

标签作用示例
<if>条件判断,满足条件时包含 SQL 片段xml <if test="name != null">AND name = #{name}</if>
<choose>多条件分支(类似 Java 的 switch-casexml <choose><when test="age != null">AND age = #{age}</when><otherwise>AND age > 18</otherwise></choose>
<foreach>遍历集合(如 List、Array)xml <foreach item="id" collection="ids" open="(" separator="," close=")">#{id}</foreach>
<where>智能处理 WHERE 子句,自动去除开头的 AND/ORxml <where><if test="name != null">AND name = #{name}</if></where>
<set>智能处理 UPDATE 语句,自动去除结尾逗号xml <set><if test="name != null">name = #{name},</if></set>
<trim>自定义字符串修剪(灵活处理前后缀)xml <trim prefix="WHERE" prefixOverrides="AND">...</trim>
<bind>创建变量并绑定到上下文(用于模糊查询等)xml <bind name="pattern" value="'%' + keyword + '%'" />
4. 典型应用场景
  1. 多条件组合查询

        SELECT * FROM user            AND name LIKE #{name}        AND age >= #{minAge}        AND age

    2.批量插入数据

        INSERT INTO user (name, age) VALUES            (#{user.name}, #{user.age})

    3.动态更新字段

        UPDATE user            name = #{name},        age = #{age},        WHERE id = #{id}
5. 优势分析
优势说明
代码简洁避免 Java 代码中复杂的 StringBuilder 拼接
可维护性强SQL 与 Java 代码解耦,修改 SQL 无需重新编译 Java
安全性高自动使用 PreparedStatement 预编译,防止 SQL 注入
智能语法处理自动处理逗号、AND/OR 等语法细节
灵活性高支持复杂逻辑(嵌套条件、循环等)
6. 底层实现原理

MyBatis 动态 SQL 基于 OGNL(Object-Graph Navigation Language)表达式 实现:

  1. 解析 XML 标签时,根据 test 属性中的 OGNL 表达式计算布尔值。

  2. 遍历 SQL 节点树,动态拼接符合条件的 SQL 片段。

  3. 最终生成标准的 PreparedStatement 可执行的 SQL。

7. 最佳实践
  • 避免过度复杂:动态 SQL 嵌套不超过 3 层,否则可拆分为多个查询。

  • 性能优化:使用 <where><set> 减少无效字符处理开销。

  • 参数校验:在 Java 层校验参数合法性,减少动态 SQL 判断分支。

  • 注解替代 XML:简单场景可用 @SelectProvider 注解实现动态 SQL:

    @SelectProvider(type = UserSqlBuilder.class, method = "buildQuery")List findUsers(UserQuery query); class UserSqlBuilder {    public String buildQuery(UserQuery query) {        return new SQL() {{            SELECT("*");            FROM("user");            if (query.getName() != null) WHERE("name = #{name}");        }}.toString();    }}
    8. 对比其他方案
    方案动态 SQLJava 拼接 SQL
    可读性高(结构化标签)低(大量字符串拼接)
    安全性高(自动预编译)低(易引发 SQL 注入)
    维护成本低(SQL 独立管理)高(SQL 散落在 Java 代码中)
    复杂逻辑支持强(标签嵌套)弱(需手动处理语法细节)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

活着,就像明天就要死去一样

活着,就像明天就要死去一样本文来自博客园,作者:breezecn,转载请注明原文链接:https://www.cnblogs.com/breezecn/p/19126572

社保网站人员减少怎么做三门峡住房和建设局网站

Qt实现可伸缩的侧边工具栏 一直在网上找&#xff0c;发现大多的实现方案都是用一个按钮&#xff0c;按下控制侧边栏的伸缩&#xff0c;但是我想要实现鼠标悬浮在侧边栏的时候就伸出&#xff0c;移开就收缩的功能&#xff0c;也没找到好的参考&#xff0c;所以决定自己实现一个…

一 网站开发背景成都网站建设方案

全省工业互联网平台推广会上台州工业互联网平台发布、7个工业互联网项目签约——“企业间一座座孤立的烟囱&#xff0c;通过数据‘联姻’打破了信息孤岛。”5月22日&#xff0c;在路桥召开的全省工业互联网平台建设推广会上&#xff0c;专家们这样形容正在发生的变革。工业互联…

vue漏洞

Vue 源码泄露(最常见低危→高危) 原理: webpack 默认生成 .js.map,生产环境未关闭,可反编译还原完整源码,泄露接口、密钥、注释路径。 黑盒特征: 响应头 X-SourceMap: xxx.js.map 或 JS 末尾出现 //# sourceMap…

安居客网站应该如何做如何对产品进行推广

观看视频前&#xff0c;请先点击上面的蓝色字“杨式太极拳习练之家教学视频"再点击“关注”&#xff0c;这样您就可以继续免费收到太极拳剑相关教学视频了。加关注后&#xff0c;再【点击】上面的蓝色字“杨式太极拳习练之家教学视频"&#xff0c;进入到“杨式太极拳…

网站第一开在浏览器中打开慢的原因

发现有两个地方可能导致网页第一次在浏览器中打开慢。什么是第一次打开慢?测试的前提是,要先清空浏览器的缓存数据,然后重启浏览器手动输入域名测试。主要在 edge中测试。第一个地方 请求的数据太多 dh.xxxxx.com的…

1.Android Compose 基础系列:您的第一个 Kotlin 程序

1.Android Compose 基础系列:您的第一个 Kotlin 程序本系列文章将用通俗易懂的方式,带你入门使用 Jetpack Compose 进行 Android 应用开发。从 Kotlin 基础语法讲起,逐步构建属于你的第一个 Compose 项目。✨ 简介 …

蓬莱市住房和规划建设管理局网站做微信推送网站

物联网是当前非常火热的话题&#xff0c;各个行业对物联网的关注和投入力度也很大&#xff0c;一些互联网巨头都在紧锣密鼓的布局物联网产业&#xff0c;抢占市场先机。 物联网的整体构架大致可以分为以下四个层面&#xff1a; 1.感知识别层 感知层是物联网整体架构的基础&…

什么网站做蔬菜生鲜比较好建设银行泰安分行网站

当前电脑主要配件的批发价&#xff0c;不面向零售哦&#xff01;下面给大家介绍一下想获得详细报价&#xff0c;持续为您更新想了解电脑系统重装请回复&#xff1a;重装系统电脑由于windows10更新卡顿请回复&#xff1a;windows 10笔记本电脑购买常识请回复&#xff1a;笔记本电…

[JVM] JVM内存调优 - 教程

[JVM] JVM内存调优 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

网站设计说明wordpress网站搭建

苹果 iOS 18 系统将为 AirPods Pro 2 用户带来一项实用功能 —— 更精细的“自适应音频”控制。AirPods Pro 2 的“自适应音频”功能包含自适应降噪、个性化音量和对话增强等特性&#xff0c;可以根据周围环境自动调节声音和降噪效果。 当更新至最新测试版固件的 AirPods Pro 2…

英文网站建设合同北京网站搭建服务

一、简介 Visual chatGPT Studio 是 Visual Studio 的一个免费扩展&#xff0c;它直接在 IDE 中添加了 chatGPT 功能。它允许用户以可以根据菜单功能的方式使用 chatGPT。 二、功能介绍 该扩展提供了一组使用 ChatGPT 命令&#xff0c;可以在编辑器中选择你需要处理的代码或…

在MyBatis中collection属性的命名规则主要取决于传入参数的类型

在MyBatis中collection属性的命名规则主要取决于传入参数的类型 命名规则‌单参数为List/Set/数组时‌默认使用"list"作为collection的值,例如传入List<String>类型参数时,collection="list&qu…

全面解析DoS攻击防护与应对策略

本文深入解析DoS攻击的工作原理、三种主要攻击类型及其后果,详细介绍风险评估、攻击面缩减等预防措施,并阐述第三方防护服务与工具的应用方案,帮助企业构建完整的DDoS防护体系。如何防范DoS攻击及遭遇攻击时的应对措…

day16 课程(面向对象三大特性:继承 多态 属性)

day16 课程(面向对象三大特性:继承 & 多态 & 属性)课程: 16.1 了解面向对象三大特性------------------------------------------------ 执行后————————————————————————————…

毕业设计博客网站开发wordpress多重筛选主题

简介进程与线程是所有的程序员都熟知的概念&#xff0c;简单来说进程是一个执行中的程序&#xff0c;而线程是进程中的一条执行路径。进程是操作系统中基本的抽象概念&#xff0c;本文介绍 Linux 中进程和线程的用法以及原理&#xff0c;包括创建、消亡等。进程创建与执行Linux…

C++ Vector算法精讲与底层探秘:从经典例题到性能优化全解析 - 指南

C++ Vector算法精讲与底层探秘:从经典例题到性能优化全解析 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

20250919_QQ_ICMP

流量分析,ICMP,pysharkTags:流量分析,ICMP,data_len,pyshark 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:20250919_QQ_ICMP.zip 0x01. WP 1. 流量…

手机站点昆明手机网站建设

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为跨语言知识图谱问答。来源&#xff1a;CIKM’2018链接&#xff1a;http://delivery.acm.org/10.1145/3280000/3271704/p247-guan.pdf?ip121.249.15.96&id3271704&accACTIVE%20SERVICE…

福建中江建设公司网站手机会员卡管理系统

文章目录 写在前面Tag题目来源题目解题解题思路方法一&#xff1a;双指针方法二&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对…