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

MyBatis中常见标签的使用(动态SQL)

MyBatis 中的动态 SQL 允许你在 XML 映射文件中编写灵活的 SQL 查询语句,根据不同的条件动态生成不同的 SQL 语句。这样可以避免在 Java 代码中拼接 SQL 字符串,使得 SQL 查询更加清晰和易维护。本文章将介绍几个常见的标签并实现动态SQL

目录

一.标签

二.标签

三.标签

四.标签

五.标签


一.<if>标签

<if> 标签用于在 SQL 映射文件中根据条件来动态生成 SQL 语句的一部分。这使得我们可以根据不同的情况动态地包含或排除特定的 SQL 片段,示例如下:

    <select id="selectByCondition" resultType="User">SELECT * FROM users<where><if test="username != null">AND username = #{username}</if><if test="email != null">AND email = #{email}</if></where></select>

在<if>标签中,当test语句成立时才会将里面的语句拼接到SQL里面,从而实现动态的效果

二.<trim>标签

<trim> 可以帮助我们处理 SQL 语句中的前缀、后缀或者指定的字符

在标签中可以指定四个属性:

  • prefix 属性定义了在整个 SQL 语句片段前添加的字符串。
  • suffix 属性定义了在整个 SQL 语句片段后添加的字符串。
  • prefixOverrides 属性指定了需要在 SQL 语句片段开头移除的前缀字符串。
  • suffixOverrides 属性指定了需要在 SQL 语句片段末尾移除的后缀字符串。

示例:

    <insert id="insertUserByCondition">INSERT INTO userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="username !=null">username,</if><if test="password !=null">`password`,</if><if test="age != null">age,</if><if test="gender != null">gender,</if><if test="phone != null">phone,</if></trim>VALUES<trim prefix="(" suffix=")" suffixOverrides=","><if test="username !=null">#{username},</if><if test="password !=null">#{password},</if><if test="age != null">#{age},</if><if test="gender != null">#{gender},</if><if test="phone != null">#{phone}</if></trim></insert>

在示例中,指定添加了前缀 '(' 和后缀 ')' ,以及将最终SQL中多余的 ',' 去除 

三.<where>标签

<where> 标签通常用于动态生成 SQL 查询语句的 WHERE 子句。它可以帮助我们处理查询条件的拼接,并且根据条件动态生成 WHERE 子句,使得 SQL 查询语句更加灵活和易于维护。

示例:

    <select id="selectByCondition" resultType="User">SELECT * FROM users<where><if test="username != null">AND username = #{username}</if><if test="email != null">AND email = #{email}</if></where></select>

在示例中,如果username和email都为null,则<where>标签将不会生成where关键字,并且会处理多余的AND

四.<set>标签

和<where>标签的功能类似,示例如下:

    <update id="updateUser" parameterType="User">UPDATE users<set><if test="username == null">username = #{username},</if><if test="email == null">email = #{email},</if></set>WHERE id = #{id}</update>

在示例中,如果username和email都为null,则<where>标签将不会生成set关键字,并且会处理多余的 ',' 

五.<foreach>标签

<foreach> 标签是 MyBatis 中用于遍历集合并生成动态 SQL 语句的标签之一。它通常用于在 SQL 语句中动态地拼接 IN 子句的值,可以非常方便地处理批量操作或者根据集合条件进行查询。

在使用时可以指定5个属性:

  • collection:指定要遍历的集合的属性名。
  • item:指定在遍历过程中当前元素的别名。
  • open:指定遍历开始时的字符串,通常用于指定 IN 子句的开头部分。
  • separator:指定每个元素之间的分隔符,通常用于指定 IN 子句中元素的分隔符。
  • close:指定遍历结束时的字符串,通常用于指定 IN 子句的结束部分。

示例如下:

<select id="selectUsersByIdList" resultType="User">SELECT * FROM usersWHERE id IN<foreach collection="idList" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>

五.<include>标签

<include> 标签是 MyBatis 中用于代码重用和模块化的标签,它可以将 SQL 片段抽取出来并在多个地方进行重复使用。这样可以提高 SQL 映射文件的可维护性,并减少重复代码的编写。

示例如下:

<!-- 定义 SQL 片段 -->
<sql id="commonColumns">column1, column2, column3
</sql><!-- 在具体的 SQL 语句中使用 <include> 引用定义的 SQL 片段 -->
<select id="selectUser" resultType="User">SELECT<include refid="commonColumns"/>FROM user_tableWHERE id = #{id}
</select>

<include> 标签的主要属性是 refid,它指定了要引用的 SQL 片段的 id。


到这里关于MyBatis的常见标签的介绍就结束了~

相关文章:

  • Java GC问题排查的一些个人总结和问题复盘
  • 【C++题解】1133. 字符串的反码
  • 开源与闭源:AI大模型发展路径的博弈
  • Windows hook介绍与代码演示
  • Flutter 中的 ColoredBox 小部件:全面指南
  • python前端通过API接口调用与后端进行数据交互前端如何调用api接口获取电商平台商品实时评论信息数据
  • Python项目生成requirements.txt文件
  • Windows搭建Nginx代理本地盘的文件(共享路径或本地路径)
  • ROS2学习——节点话题通信(2)
  • 【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化
  • Python代码:十七、生成列表
  • 2005-2022年各省全体居民人均可支配收入数据(无缺失)
  • C++核心编程——4.7 多态
  • HttpClient cookie爬虫记录
  • 46. 全排列 - 力扣(LeetCode)
  • conda常用的命令
  • Java 多线程编程之:notify 和 wait 用法
  • Linux快速复制或删除大量小文件
  • PHP的类修饰符与访问修饰符
  • SpringBoot几种定时任务的实现方式
  • 算法之不定期更新(一)(2018-04-12)
  • No resource identifier found for attribute,RxJava之zip操作符
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • # Apache SeaTunnel 究竟是什么?
  • (003)SlickEdit Unity的补全
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (二)正点原子I.MX6ULL u-boot移植
  • (六)软件测试分工
  • (五)网络优化与超参数选择--九五小庞
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一) springboot详细介绍
  • (转)C#调用WebService 基础
  • (转)菜鸟学数据库(三)——存储过程
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • [ A*实现 ] C++,矩阵地图
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [2669]2-2 Time类的定义
  • [Android]Android开发入门之HelloWorld
  • [bzoj 3534][Sdoi2014] 重建
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [EFI]NUC11电脑 Hackintosh 黑苹果efi引导文件
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [HNOI2006]鬼谷子的钱袋
  • [iOS]如何删除工程里面用cocoapods导入的第三方库
  • [LeeCode]-Divide Two Integers 不用乘除的除法运算
  • [LeetCode]284. Peeking Iterator(C++,类,暴力)
  • [Linux] LVS+Keepalived高可用集群部署
  • [Linux打怪升级之路]-vim编辑器(看就能马上操作噢)
  • [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'XXX' 无效
  • [MySQL--进阶篇]存储引擎的体系结构、简介、特点、选择