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

【MyBatis笔记09】MyBatis中常用的几个动态SQL标签

这篇文章,主要介绍MyBatis中常用的几个动态SQL标签。

目录

一、MyBatis动态SQL

1.1、什么是动态SQL

1.2、if判断标签

1.3、choose判断标签

(1)when标签

(2)otherwise标签

1.4、where标签

1.5、set标签

1.6、trim标签

(1)实现where标签功能

(2)实现set标签功能

1.7、foreach标签


一、MyBatis动态SQL

1.1、什么是动态SQL

什么是动态SQL呢???顾名思义,就是SQL语句不是固定的,而是在程序运行过程中动态变化的,MyBatis框架提供了动态SQL的功能,这也是MyBatis框架强大的功能之一。通过使用MyBatis的动态SQL,可以很容易实现复杂SQL语句的拼接,而不需要像原始的JDBC那样,通过任何的java代码来拼接SQL字符串。下面介绍动态SQL的常用标签。

1.2、if判断标签

if标签只有一个【test】属性,这个属性用于判断表达式是否成立。当test条件成立之后,Mybatis就会将if标签之间的代码拼接到SQL语句上面。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <select id="queryTable" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">
        select * from user
        <if test="username != null and username != ''">
            where username = #{username}
        </if>
    </select>
</mapper>

if标签中,test属性如果由多个条件,则可以使用【and】或者【or】进行连接。

如果要访问某个对象中的属性,可以直接通过【对象名称.属性名称】的方式获取到。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <select id="queryTable" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">
        select * from user
        <if test="user.password != null and user.password != ''">
            where password = #{password}
        </if>
    </select>
</mapper>

1.3、choose判断标签

choose标签和if标签类似,作用都是用于判断是否满足条件,但是choose标签可以同时设置多个情况,也就是java中的switch...case语句。

在choose标签里面,通过使用【when】标签和【otherwise】标签来实现条件的判断。

(1)when标签

when标签,只有一个【test】属性,当满足test条件的时候,就会执行when标签里面的代码。

(2)otherwise标签

otherwise标签,是在所有的when标签都不满足条件的时候,才会执行otherwise标签里面的代码。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <select id="query2" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">
        select * from user
        where 1 = 1
        <choose>
            <when test="username != null and username != ''">
                and username = #{username}
            </when>
            <when test="password != null and password != ''">
                and password = #{password}
            </when>
            <otherwise>
                and id = #{id}
            </otherwise>
        </choose>
    </select>
</mapper>

1.4、where标签

where标签,主要作用就是在拼接SQL语句的时候,如果SQL语句没有where关键字,那么此时会自动添加一个where关键字,并且如果拼接的SQL语句中,查询条件是以【and】或者【or】开头,那么where标签也会将多余的【and】或者【or】去掉,从而避免SQL语句错误。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <select id="query" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">
        select * from user
        <where>
            and username = #{username}
        </where>
    </select>
</mapper>

上面SQL语句,可以看到拼接的SQL语句是【and】开头的,按理来说应该是错误的,但是由于使用了where标签,所以Mybatis在拼接的时候会将开头多余的【and】去掉,这样就保证了SQL语句是正确的。

1.5、set标签

set标签是用于update更新操作的set关键字。set标签作用是在拼接的SQL字符串之前添加【set】关键字,并且还可以去除多余的【,】逗号。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <update id="updateData" parameterType="com.mybatis.demo.domain.User">
        update user
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password},
            </if>
        </set>
        where id = #{id}
    </update>
</mapper>

上面代码最终拼接的SQL语句如下所示:

1.6、trim标签

trim标签,可以实现和where标签、set标签相同的功能,但是trim标签更加的灵活,它可以自定义去除哪些前缀,并且插入哪些内容。

(1)实现where标签功能

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <select id="query3" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">
        select * from user
        <trim prefix="where" prefixOverrides="and |or ">
            <if test="username != null and username != ''">
                AND username = #{username}
            </if>
        </trim>
    </select>
</mapper>

trim标签属性:

  • prefix属性:需要在拼接的SQL之前添加的前缀内容。
  • prefixOverrides属性:需要将哪些SQL前缀内容去除。不区分大小写,多个可以使用【|】竖线分隔。
  • suffix属性:需要在拼接的SQL之后添加的后缀内容。
  • suffixOverrides属性:需要将哪些SQL后缀内容去除。不区分大小写,多个可以使用【|】竖线分隔。

就以上面的代码为案例,就是将【and 】和【or 】开头的前缀内容全部替换为where内容。

注意:【and 空格|or 空格】这个之间必须使用空格。

(2)实现set标签功能

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <update id="updateData2" parameterType="com.mybatis.demo.domain.User">
        update user
        <trim prefix="set" suffixOverrides=",">
            <if test="username != null">
                username = #{username},
            </if>
            <if test="password != null">
                password = #{password},
            </if>
        </trim>
        where id = #{id}
    </update>
</mapper>

1.7、foreach标签

foreach标签,可以遍历一些集合、数组等数据,它是实际开发中使用最多的标签之一。foreach标签有如下几个属性:

  • collection属性:需要遍历的集合、数组等名称,如果通过@Param注解指定了名称,则使用具体的名称,否则会有以下几个默认值:collecction、array、list、arg0。
  • item属性:当前集合、数组中遍历到的一条数据。
  • index属性:当前集合、数组中遍历到的下标。
  • open属性:指定开头的字符。
  • close属性:指定结尾的字符。
  • seperator属性:指定分隔符。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.UserMapper">
    <!-- 动态SQL -->
    <select id="query5" parameterType="com.mybatis.demo.domain.User" resultType="com.mybatis.demo.domain.User">
        select * from user
        <where>
            id in
            <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
                #{item.id}
            </foreach>
        </where>
    </select>
</mapper>

以上,就是MyBatis框架常用的几个动态SQL标签。

综上,这篇文章结束了,主要介绍MyBatis中常用的几个动态SQL标签。

相关文章:

  • Apache Geode<1.15.0 不受信任的反序列化漏洞
  • GitLab 中 GitHub 导入 API 存在远程代码执行漏洞
  • 什么是生成器 — 一篇文章让你看懂
  • 国内近五年人工智能教育的研究热点及趋势——基于多维尺度和社会网络分析的方法
  • QGraphicsItem鼠标拖动旋转(五)
  • win7连接打印机0x0000011b错误的解决办法
  • 四、RocketMq本地集群搭建:多master-slaver异步
  • pcan二次开发文档 | PEAK-System Documentation
  • R语言数据分组聚合实战:使用aggregate函数对mtcars数据通过两个分类变量进行数据分组聚合、并计算分组的均值、使用na.rm删除异常值
  • Chapter15 : Artificial Intelligence in Compound Design
  • 前端HTML5 +CSS3 1. 基础认知
  • R语言替换字符串中指定字符的子串:sub函数查找字符串中第一个匹配到的子串并替换、如果要删除指定字符串子串则将替换的子符串设置为空字符串
  • java计算机毕业设计基于springboo大学生社团管理系统 vue+elementui
  • un9.2:创建springboot的两种方式。
  • dubbo的Failed to save registry store file问题
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【Amaple教程】5. 插件
  • 10个确保微服务与容器安全的最佳实践
  • Go 语言编译器的 //go: 详解
  • Java 多线程编程之:notify 和 wait 用法
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Js基础——数据类型之Null和Undefined
  • Python打包系统简单入门
  • Redis字符串类型内部编码剖析
  • Web设计流程优化:网页效果图设计新思路
  • 半理解系列--Promise的进化史
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 给初学者:JavaScript 中数组操作注意点
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 物联网链路协议
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 7行Python代码的人脸识别
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 整理一些计算机基础知识!
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #图像处理
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (LeetCode 49)Anagrams
  • (poj1.3.2)1791(构造法模拟)
  • (二)斐波那契Fabonacci函数
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (四)图像的%2线性拉伸
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET4.0并行计算技术基础(1)
  • .NET基础篇——反射的奥妙
  • .考试倒计时43天!来提分啦!
  • /*在DataTable中更新、删除数据*/