MyBatis笔记Day03_MybatisDynamic(动态)SQL

什么是动态SQL呢?
    所谓动态是相对于静态而言的,静态SQL就是确定是SQL语句,用于完成确定的任务。而动态SQL则正好与之相反,动态SQL是不那么确定的,要完成的任务也是不那么确定的。
    举个例子:
用户表表结构如下:
在这里插入图片描述
测试数据如下:
在这里插入图片描述
如果要查询用户表中的所有记录,那么这需要就是固定的,它所对应的SQL语句也是固定的。

SELECT * from USER;

在这里插入图片描述

但是,如果想要做一个搜索功能,比如根据username,sex,address中的一个或者多个去查询用户。显然静态的SQL是不能完成的,因为不确定where后面的条件个数,可能有一个,两个,三个。这时就需要用到动态SQL。在MYSQL中,一般使用存储教程来处理,那么在Mybatis中要如何处理呢?
这就是今天要学习的内容。
首先,我们可以先看看Mybatis官方的文档中对于动态SQL的介绍。

  • if标签
         if标签是动态SQL中最常用的标签,类似于java中的if语句,其中test属性负责判断,if标签内是test为true之后要拼接上去的sql片段,要注意的是and前后的空格,因为如果没有空格,那么拼接起来and就不是关键字了。其实在这里还是有些问题的,因为当所有的if都不成立时,那么where后面就没有条件,sql语句就变成了select * from user where,这样的sql是有问题的。
select * from user where
        <!-- 注意and前后的空格,否则会出错! -->
        <if test="username!=null"> and username = #{username}</if>
        <if test="sex!=null"> and sex = #{sex}</if>
  • where标签
        细细观察会发现,where关键字不见了,取而代之的是where标签。这就是Mybatis对上面提到问题的解决方案,Mybatis只会在where中的if至少一个成立时都会向sql语句中加入where关键字。
select * from user
        <!-- 注意and前后的空格,否则会出错! -->
        <where>
            <if test="username!=null"> and username = #{username}</if>
            <if test="sex!=null"> and sex = #{sex}</if>
        </where>
  • foreach标签
        熟悉PHP或者js的应该都知道,foreach是用来遍历数组的,这里的foreach也不例外。例子中ids是一个数组,item就是当前索引对应的一个值,相当于ids[0],ids[1]…中的一个。open属性是开头,close是结尾,separator是元素之间的分隔符,而foreach中的内容就是要item的值,然而item对应的值是个变量,所以要用#{}将其取出来。
        这样说可能看不懂,但是没有关系。
        假定这里的ids={10, 11, 12},那么得到的预处理sql就是select * from user WHERE id in ( ? , ? , ? ),真正的sqlselect * from user WHERE id in ( 10 , 11 , 12 )。通过例子再对比上面的描述是不是很清楚了呢?
select * from user
        <!-- 注意and前后的空格,否则会出错! -->
        <where>
            <if test="ids != null and ids.size() > 0">
                <foreach collection="ids" open=" id in (" close=" ) " item="uid" separator=" , ">
                    #{uid}
                </foreach>
            </if>
        </where>

Mybatis中关于动态SQL的三个常用标签就学习到这里。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读