Mybatis动态sql

目录

if

where

trim

choose、when、otherwise

foreach

特殊符号处理

使用转义字符

使用来<![CDATA[]]>包裹特殊字符


动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

if

在查询时,我们可以将条件动态传入sql语句中,将if关键字当作一个标签处理

XML 复制代码
<select id="find" resultType="Student">
        select * from Student where id>0
            <if test="num!=0">
                and num = #{num}
            </if>
</select>

如果if的条件不成立,就会返回所有id>0的数据

where

对于查询条件个数不确定的情况,可使用元素。如下

XML 复制代码
<select id="id" parameterType="" resultType="">
        SELECT xxx... FROM table t
    <where>
        <if test="name != null &amp; name!='' ">
            name like #{name}
        </if>
        <if test="age!=null &amp; age>0">
            AND age> #{value}
        </if>
    </where>
</select>

元素会进行判断,如果它包含的标签中有返回值的话,它就插入一个 'where'。 此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉 AND 或 OR。

trim

where 标签,其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的 时候,就去除 AND 或者 OR。

XML 复制代码
<select id="find" resultType="Student">
        select * from Student
        <trim prefix="where" prefixOverrides="and">
            <if test="num!=0">
                and num = #{num}
            </if>
            <if test="name!=null">
                and name = #{name}
            </if>
        </trim>
</select>

prefix="where" 有条件成立时,添加where关键字

prefixOverrides="and" 覆盖and关键字

choose、when、otherwise

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

XML 复制代码
<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM student WHERE id>0
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

foreach

对集合进行遍历主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach 元素的属性主要有 item,index,collection,open,separator,close。

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

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

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

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

close:表示以什么结束

foreach可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

XML 复制代码
<select id="selectPostIn" resultType="Student">
  SELECT * FROM student
  <where>
    <foreach item="item" index="index" collection="list"
        open="ID in (" separator="," close=")" nullable="true">
          #{item}
    </foreach>
  </where>
</select>

特殊符号处理

使用转义字符

|----|---------|
| < | &lt; |
| > | &gt; |
| " | &quto; |
| ' | &apos |
| & | &amp |

使用来<![CDATA[]]>包裹特殊字符

XML 复制代码
<if test="id != null">
    AND <![CDATA[ id <> #{id} ]]>
</if>
相关推荐
a5876918 分钟前
消息队列(MQ)高级特性深度剖析:详解RabbitMQ与Kafka
java·分布式·面试·kafka·rabbitmq·linq
代码雕刻家23 分钟前
3.1.Maven-课程介绍
java·maven
li357429 分钟前
深入理解:MQ监听类 vs Spring事件监听类 —— 区别、用法与适用场景全解析
java·数据库·spring
灵感蛙42 分钟前
《苍穹外卖》项目日记_Day7
java·spring boot·redis
lifallen44 分钟前
KafkaStreams 计算图节点设计:ProcessorNode、SourceNode、SinkNode
java·数据结构·算法·kafka·apache
索迪迈科技1 小时前
java后端工程师进修ing(研一版‖day42)
java·开发语言·学习·算法
半桔1 小时前
【Linux手册】消息队列从原理到模式:底层逻辑、接口实战与责任链模式的设计艺术
java·linux·运维·服务器
Chris.Yuan7701 小时前
Java代理模式详解
java·开发语言·代理模式
Mr.朱鹏1 小时前
ShardingJDBC实战指南
java·jvm·数据库·spring·分库分表·shardingjdbc·shardingshere
学习OK呀1 小时前
从 java8 升级 java17 的调整
java·后端