千家信息网

MyBatis中如何使用动态SQL标签

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍MyBatis中如何使用动态SQL标签,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.MyBatis动态SQLMyBatis 的强大特性之一便是它的动态 SQ
千家信息网最后更新 2025年02月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安全错误 数据库的锁怎样保障安全 宿州系统软件开发费用 网络安全的五大特征 服务器漏洞扫描服务济南 小白测评数据库百问 用户定义约束数据库ER图 云游戏的服务器如何 网络安全技术风险 江苏特色软件开发口碑推荐 大学生网络安全教育答案 共享文件服务器管理 画画图片大全8k纸网络安全 骑士精神2主机版能选服务器吗 我的世界服务器联机空岛战争 数据库默认建立的表空间 京东 不让百度抓取数据库 学生网络安全教育视频动画 ATM是不是无线网络技术 哥白尼计划软件开发 sql数据库实验怎么 三大中文期刊数据库 茂名无限软件开发平均价格 目前阿里用什么数据库 梦幻西游手游平平安安服务器 服务器如何接受数据 金山区营销软件开发哪家好 仟佰互联网科技股份有限公司 数据库专业实验三 网络安全和信息化部门是哪个 黑龙江服务管理软件开发 顺德区智匙网络技术有限公司
0