MyBatis 动态SQL的标签有哪些?如何使用?

这篇具有很好参考价值的文章主要介绍了MyBatis 动态SQL的标签有哪些?如何使用?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. MyBatis 动态SQL标签有什么用?

2. if 标签

3. where 标签

4. trim 标签

5. choose,when,otherwise

6. foreach


1. MyBatis 动态SQL标签有什么用?

我来说一个场景大家就明白了,如下图,大家应该在铁路12306上买过火车票吧,可以看到,我们在选票的时候可以对车做很多种选择和筛选,系统会自动根据你的选择给你匹配适应的车次,其实它的底层就是采用的动态SQL拼接的方式完成的,系统会根据用户不同的选择动态生成不同的SQL语句,然后交给数据访问层去操作查询。

MyBatis 动态SQL的标签有哪些?如何使用?,mybatis,sql,数据库

 下面我就来一个个介绍MyBatis框架给我们提供了哪些动态 SQL 拼接的标签。

2. if 标签

当我们实际开发多条件查询让用户选择的业务场景时,也许用户不会把所有筛选条件都选上,比如我们出去旅游,在美团上订酒店,可以按距离,按价格,按星级筛选,也许你不会把所有条件都选上,可能只选一个,但它也会查询出结果,这个时候它就可以采用 if 标签生成动态SQL语句达到我们的目的。

if 标签可以通过它提供的 test 属性对数据内容做判断,判断是否满足要求。若满足,if 标签内部的内容就会执行,反之则不执行。

使用方式就是

<if test = "判断条件">为true要执行的语句段<if>

示例如下代码所示

// 在 mapper 映射文件中写我们的 SELECT 查询语句
// 这里if标签内不能使用Java中的 && 连接符,mybatis 为我们提供了and关键字专门用来做连接操作
<select id="findByNameAndAge" resultType="User">
            select * from user where 1=1
            <if test="username != null and username != ''">
                and username = #{username}
            </if>
            <if test="age != null and age != ''">
                and age = #{age}
            </if>
        </select>
// 这里我只是写了 username 和 age 连个字段,实际开发过程中字段也许会很多,
// 这里举例就写的简单一些,其实都一样,当有其他字段时,继续追加 if 标签就可以了

如上举例 if 标签,我们可以在开发时,就可以将用户不一定选择的查询条件使用 if 标签包裹起来,test = "" 双引号内部就是我们的判断条件,不为空或者不为空字符串,和我们Java中的 if 判断非常相似,只有我们的 test 判断结果为 true,即用户输入的结果不为空也不是空字符串,说明用户输入的是有效数据,我们就将用户想要查询的过滤条件加入到查询条件中,如果为false,则该字段的筛选条件不参与SQL语句中。

这里有几个注意点我要提醒一下,各位同学千万注意!!!

(1)在 where 条件的后面,我们最好写一个恒成立的等式,例如1=1,2=2;

(2)每个 if 标签内的字段前面都要加上一个 and;

因为如果我们 if 标签内的结果都不成立,那么 SQL 语句就变成了 SELECT * FROM user WHERE 1=1。语法没有任何问题,但如果我们不加1=1 ,查询语句就会变成 SELECT * FROM user WHERR。WHERE 查询条件后面没有任何东西,就会出现语法级别的错误,这是绝对不允许出现的,为了避片此种情况,我们可以在 WHERE后面加上一个恒成立条件,使 WHERE 关键字无论何时都会起作用并且 SQL 语句语法不出错;

这是其中一点,另外一点就是,可以和我们 if 标签内的 and 完美连接。

我举一个例子,假设前端传递过来的数据 username 为空不满足条件,那么 SQL 语句就变成了 SELECT * FROM user WHERE 1=1 and age = #{age}。此时语法也没有任何问题,并且可以和 and 关键字巧妙连接。不但解决了可能出现的 SQL 语法问题,还解决了 and 关键字可能多余的情况。

3. where 标签

WHERE 标签的使用方式也很简单,大多是搭配 if 使用的。

使用方式 <WHERE>if 表标签内容</WHERE>

可以看到,在我刚才 if 标签中,我们将WHERE关键字写死了,不管后面的 if 标签是否生效,WHERE都会拼接到SQL语句中,这样的写法有些死板,而我们的 WHERE 标签就可以动态生成 WHERE 关键字。

将刚才 if 中的代码修改后如下:

<select id="findByNameAndAge" resultType="User">
            select * from user
            <where>
                <if test="username != null and username != ''">
                    username = #{username}
                </if>
                <if test="age != null and age != ''">
                    and age = #{age}
                </if>
            </where>
        </select>

我们只需要将所有的条件判断全部写到 WHERE 标签内部即可。

(1)WHERE标签内只要有一个条件生效,WHERE就会动态生成并拼接到SQL语句中;

(2)如果WHERE标签内部的都不执行,那么WHERE也不会生成;

(3)WHERE 还可以智能地将语句前面多余的 and 删除,也可以将 or 删除。

(4)and 或 or 连接符只能写在字段判断的前面,不能写在后面,否则 WHERE 标签将无法自动智能删除,只有写在前面才有效果;

例如,我的 username =#{username}不执行,那么理论上SQL语句就会变成 SELECT * FROM user WHERE and age = #{age}。但实际上,WHERE标签会智能将 and 删除,就会变成 SELECT * FROM user WHERE age = #{age}。

4. trim 标签

trim 标签是一个单独的标签,它可以单独使用,如下图,可以看到,该标签一共提供了四个属性

MyBatis 动态SQL的标签有哪些?如何使用?,mybatis,sql,数据库

其中 prefix 翻译过来是"前缀",prefixOverrides 为 "前缀重写",suffix 为 "后缀",suffixOverrides 为 "后缀重写"。

prtefix/suffix:在trim标签中内容前面/后面添加指定内容;

prefixOverrides/suffixOverrides:在trim标签中内容前面/后面去掉指定内容;

而且 trim 标签中有内容时,trim就会生效,如果没有内容,trim标签也不会生效。

我们想要达到上面 WHERE 标签一样的效果,可以像下面这样写,使用 prefix 属性添加前缀 WHERE,使用 prefixOverrides 去掉多余的 and和or,他们中间用 "|" 连接。

<select id="findByNameAndAge" resultType="User">
            select * from user
            <trim prefix="where" prefixOverrides="and|or">
                <if test="username != null and username != ''">
                    username = #{username}
                </if>
                <if test="age != null and age != ''">
                    and age = #{age}
                </if>
            </trim>
        </select>

 当我们if 标签内 and 写在后面的时候,只需要使用 suffixOverrides 就可以达到效果,如下代码所示

<select id="findByNameAndAge" resultType="User">
            select * from user
            <trim prefix="where" suffixOverrides="and|or">
                <if test="username != null and username != ''">
                    username = #{username} and
                </if>
                <if test="age != null and age != ''">
                    age = #{age}
                </if>
            </trim>
        </select>

我们只需要将 prefixOverrides 改为 suffixOverrides就可以达到效果。 

5. choose,when,otherwise

这三个标签一般情况下会一起出现,它与我们Java中 if...else if...else 的功能非常相似。

使用方式如下

这里要注意,<when>标签至少需要写一个,而<othersise>最多只能写一个。

<choose>
    <when test="判断条件">...</when>
    <when test="判断条件">...</when>
    <otherwise>判断条件</otherwise>
</choose>

当我们写这样的一个标签体时,只要有一个条件成立,它就不会再继续向下判断了,直接将满足条件的字段拼接到SQL语句中。也就是说,该标签体内就算有多个条件都满足,但还是只会执行第一个满足条件的字段查询。

它们也可以搭配<WHERE></WHERE> 或者<trim></trim> 使用,大家可以自由选择,这里我举例使用<WHERE></WHERE>,示例代码举例如下

<select id="findByNameAndAge" resultType="User">
            select * from user
            <where>
                <choose>
                    <when test="username != null and username != ''">
                        username = #{username}
                    </when>
                    <when test="age != null and age != ''">
                        age = #{age}
                    </when>
                    <otherwise>uid = 1</otherwise>
                </choose>
            </where>
        </select>

当我们像上面这样写的时候,username 和 age 的判断只会执行一个,即使用户填写的都是有效数据,我们也会只执行第一个 username 的判断,所以在开发时需要根据具体的业务场来使用该标签体。如果都不满足,我们可以在 otherwise 中编写一个候选查询条件。

6. foreach

foreach 听名字我们也大概可以猜到它是用来循环的,使用该标签可以实现我们对数据的批量添加和批量删除操作。

foreach标签也为我们提供了几个属性,下面我会依次说明这些属性是做什么用的

MyBatis 动态SQL的标签有哪些?如何使用?,mybatis,sql,数据库

cllection:代表要遍历的数组,Java接口在定义是最好使用@Parm进行标注;

item:表示数组中的每个元素;

open:表示该标签体以什么开头;

close :表示该标签体以什么结尾;

separator:表示数据之间的分隔符是什么;

现在有一个场景,根据传输过来的数组中的用户id批量删除这些用户信息。

就此场景,我们就可以使用<foreach>标签来完成;

代码如下

<delete id="deleteListsByUid">
        delete from user where uid in
        <foreach collection="userList" item="uid" open="(" close=")" separator=",">
            #{uid}
        </foreach>
    </delete>

我们批量数据操作时,前面有数据库关键字 in ,所以需要加"()",因此则是以 "(" 开头,以 ")" 结尾,所以标签属性 open = "(",close = ")"。其实 open 和 close也不常用,我们可以自己添加,这里只是给各位说明它们两个的作用。

此外,因为数组中有多个数据,因此每个数据在SQL语句中需要使用逗号隔开,因此 separator = ","。文章来源地址https://www.toymoban.com/news/detail-669790.html

到了这里,关于MyBatis 动态SQL的标签有哪些?如何使用?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MyBatis】四、MyBatis中的动态SQL标签

    动态SQL语句是动态的拼接Mybatis中SQL语句的情况,可以动态的在Mybatis中使用SQL if语句的xml文件: 传入对象来进行调用: where标签中的and会被自动去掉,并且若没有合适的内容,则不会添加where 注意:where标签只能去掉条件前的and、五福去掉条件后的and trim标签会在其内容

    2024年02月09日
    浏览(29)
  • MyBatis 动态SQL之<where>标签-

    where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件。 在if标签和choose-when-otherwise标签的案例中,SQL语句加入了一个条件’1=1’,它既保证了where后面的条件成,页避免了where后面出现的第一个词语是and 或者or之类的。 假设把条件‘1=1’去掉,可以出

    2024年02月11日
    浏览(37)
  • MyBatis 中的动态 SQL 是什么? 如何使用动态 SQL?

    在 MyBatis 中,动态 SQL 是指能够根据条件动态生成 SQL 语句的功能。通过使用动态 SQL,可以根据不同的条件生成不同的 SQL 语句,从而实现灵活的查询和操作。 条件判断:通过 , , , 标签实现 SQL 语句中的条件逻辑,根据传入参数的值来决定是否包含某一部分 SQL 语句。 循环遍

    2024年04月15日
    浏览(24)
  • 数据库操作不再困难,MyBatis动态Sql标签解析

    MyBatis缓存原理 Mybatis的CachingExecutor与二级缓存 Mybatis plugin 的使用及原理 MyBatis四大组件Executor、StatementHandler、ParameterHandler、ResultSetHandler 详解 MyBatis+Springboot 启动到SQL执行全流程 使用MyBatis,或者MyBatis-plus,有一项重要的开发技能就是写动态sql,动态sql能帮我们省略很多复杂逻

    2024年02月12日
    浏览(57)
  • MyBatis 动态SQL之<choose><when><otherwise>标签-

    MyBatis 中动态语句 choose-when-otherwise 类似于 Java 中的 switch-case-default 语句。由于 MyBatis 并没有为 if 提供对应的 else 标签,如果想要达到…… 的效果,可以借助 、、 来实现。 hoose 标签按顺序判断其内部 when 标签中的判断条件是否成立,如果有一个成立,则执行相应的 SQL 语句

    2024年02月09日
    浏览(35)
  • Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述动态 sql 的执行原理不?

            OGNL表达式         OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对Java对象图进行导航。         OGNL表达式的基本单位是\\\"导航链\\\",一般导航链由如下几个部

    2024年02月15日
    浏览(34)
  • mybatis的<sql>标签使用

    记录 :421 场景 :使用MyBatis的sql/sql标签元素,把重复的SQL语句集中到sql标签,使用标签的id属性指定唯一标识。在insertupdatedeleteselect等标签中使用include/include标签引用sql/sql标签。 版本 :JDK 1.8,Spring Boot 2.6.3,mybatis-3.5.9。 1.基础知识 1.1MyBatis的标签 (1)查看MyBatis支持的标签 地址

    2024年01月22日
    浏览(28)
  • MyBatis的代理开发方式、动态sql语句和typeHandlers和plugins标签实战

    接上篇博客: MyBatis基础知识和快速入门、MyBatis核心配置文件讲解,本文继续讲解MyBatis动态SQL语句、typeHandlers和plugins标签。 传统开发方式 编写UserDao接口 编写UserDaoImpl实现 mapper文件 测试传统方式 代理开发方式 代理开发方式介绍 采用 Mybatis 的代理开发方式实现 DAO 层的开发

    2023年04月27日
    浏览(30)
  • 深入解析 MyBatis 中的 <;foreach>; 标签:优雅处理批量操作与动态 SQL

    在当今的Java应用程序开发中,数据库操作是一个不可或缺的部分。MyBatis作为一款颇受欢迎的持久层框架,为我们提供了一种优雅而高效的方式来管理数据库操作。在MyBatis的众多特性中, foreach 标签无疑是一个强大的工具,它使得在SQL语句中进行动态循环迭代变得轻而易举。

    2024年02月13日
    浏览(37)
  • 如何理解mybatis中sql的动态和静态

    在MyBatis中,SQL的语句可以分为动态和静态。静态SQL是指在应用程序编写SQL语句时已经固定好的SQL语句,而动态SQL则是可以根据条件动态地生成SQL语句。 动态SQL在实际开发中非常常见,它可以根据条件进行if、choose、when、otherwise、foreach等元素的组合拼接,从而生成不同的SQL语

    2024年02月13日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包