千家信息网

MyBatis中如何使用动态SQL标签

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍MyBatis中如何使用动态SQL标签,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.MyBatis动态SQLMyBatis 的强大特性之一便是它的动态 SQ
千家信息网最后更新 2026年11月02日MyBatis中如何使用动态SQL标签

这篇文章主要介绍MyBatis中如何使用动态SQL标签,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1.MyBatis动态SQL

MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

2.动态SQL标签:if,choose (when, otherwise),trim (where, set),foreach

2.1 if标签:直接上代码

注:if标签一般用于非空验证,如上例,若id为空,if标签里的代码,将不会执行,反之,则会执行。

2.2 choose(when,otherwise)标签:直接上代码

注:choose(when,otherwise)标签相当于switch(case,default) ,如上例,若title 为空,when标签里的代码,将不会执行,默认执行otherwise标签里面的代码。

2.3 trim(where,set)标签:直接上代码

注:假设上例传入的username,password不为空,代码就可以运行成功!但朋友们可能有疑问了,实际上执行的sql语句是什么呢?其实,sql为:select * from user

where username=? and password=? 朋友们是否发现,where标签代替了sql中where关键字,但if中的and不见了。其实where标签可以自动去除是"AND"或"OR"开头的sql中的"AND"或"OR"关键字。

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制sql,实现where标签的效果。代码如下:

set标签,代码如下:

                 update user                                                                    username=#{username}                                                                                                          id=#{id}                                               

注:set标签功能和where标签差不多,set标签代替了sql中set关键字,set标签可以自动去除sql中的多余的","

同理,trim标签也可以实现set标签的功能

                 update user                         username=#{username}                                       id=#{id}                     

2.4 foreach标签:foreach标签实现批量删除,直接上代码

  delete from user  where id in          #{id}  

注:foreach标签可迭代任何对象(如列表、集合等)和任何的字典或者数组对象传递给foreach作为集合参数,当使用可迭代对象或者数组时,index是当前迭代的次数,item的值是本次迭代获取的元素。当使用字典(或者Map.Entry对象的集合)时,index是键,item是值。collection标签可以填('list','array','map')。

foreach元素的属性主要有 item,index,collection,open,separator,close。

item表示集合中每一个元素进行迭代时的别名;

index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置;

open表示该语句以什么开始,

separator表示在每次进行迭代之间以什么符号作为分隔符;

close表示以什么结束。

3.bind

bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:

4.Multi-db vendor support

一个配置了"_databaseId"变量的 databaseIdProvider 对于动态代码来说是可用的,这样就可以根据不同的数据库厂商构建特定的语句。比如下面的例子:

            select seq_users.nextval from dual              select nextval for seq_users from sysibm.sysdummy1"        insert into users values (#{id}, #{name})

动态 SQL 中可插拔的脚本语言

MyBatis 从 3.2 开始支持可插拔的脚本语言,因此你可以在插入一种语言的驱动(language driver)之后来写基于这种语言的动态 SQL 查询。

可以通过实现下面接口的方式来插入一种语言:

public interface LanguageDriver {  ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);  SqlSource createSqlSource(Configuration configuration, XNode script, Class parameterType);  SqlSource createSqlSource(Configuration configuration, String script, Class parameterType);}

一旦有了自定义的语言驱动,你就可以在 mybatis-config.xml 文件中将它设置为默认语言:

    

除了设置默认语言,你也可以针对特殊的语句指定特定语言,这可以通过如下的 lang 属性来完成:

或者在你正在使用的映射中加上注解 @Lang 来完成:

public interface Mapper {  @Lang(MyLanguageDriver.class)  @Select("SELECT * FROM BLOG")  List selectBlog();

以上是"MyBatis中如何使用动态SQL标签"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

标签 动态 代码 语言 元素 迭代 语句 对象 强大 关键 关键字 功能 可以通过 不同 痛苦 内容 变量 如上 字典 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 中智农互联网科技 上海喔噻互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网 卓越科技 杭州互联网科技公司 天津摩尔互联网科技 互联网科技公司有哪些 山东吉时兔互联网科技有限公司 天速互联网络科技有限公司 创业天下互联网科技有限公司 互联网公司科技股 湖南一路畅行互联网科技 科技类公司包括互联网吗 互联网方面的科技前沿 伍佰万互联网科技怎么赚钱 皮皮虾互联网科技有限公司 宁波跨境商互联网科技有限公司 互联网金融运营模式中的金融科技 科技美学互联网 艺术 互联网科技工作委员会毛军 互联网科技论文 互联网养老 桔豆科技 顺网科技2021年互联网排名 深圳国际航运科技和互联网 互联网科技商业 燊美集互联网科技有限公司 恒生互联网科技业指数调整周期 北京市互联网新科技 互联网科技博主张洲
0