• 【JavaEE】MyBatis 动态SQL 使用讲解



    动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。

    mybatis动态SQL官方文档点此跳转~

    1. if 标签

    判断一个参数是否是有值的,如果没值,就会隐藏if中的SQL。

    应用场景如下:
    在注册用户功能时候,有些时候像头像就不是非必填的,如果没有填就是一个默认头像,也就是说,注册分为两种字段:必填字段和⾮必填字段,if 标签就是为了解决添加用户时候有不确定的字段传⼊时候的SQL拼接了。具体使用方法如下:

    以数据库用户表为列,头像字段为非必填参数,且设置了默认值:
    在这里插入图片描述
    此时在注册添加用户时候,photo就是非必填字段:
    mapper接口:
    在这里插入图片描述
    xml实现:
    在这里插入图片描述
    此时单元测试在传或不传photo时SQL均不会报错:
    不传photo时生成SQL:
    在这里插入图片描述
    传photo时生成的SQL:
    在这里插入图片描述
    此时可以看到记录均添加成功:
    在这里插入图片描述
    注意 test 中填写的,是传⼊对象中的属性,不是数据库字段。
    (所以在设计时候尽量保证数据库字段和对象属性名称一致)

    2. trim 标签

    trim标签最主要的作用是:去除SQL语句前后多余的某个字符。

    之前的插⼊⽤户功能,只是有⼀个 photo 字段可能是选填项,如果有多个字段,⼀般考虑使⽤ trim 标签结合 if 标签,对多个字段都采取动态⽣成的⽅式,具体使用如下:

    mapper接口声明如下:
    在这里插入图片描述
    xml实现如下:
    在这里插入图片描述
    属性解释如下:

    • prefix:表示整个语句块,以prefix的值作为前缀
    • suffix:表示整个语句块,以suffix的值作为后缀
    • prefixOverrides:表示整个语句块要去除掉的前缀
    • suffixOverrides:表示整个语句块要去除掉的后缀

    这里我们整个语句块是(xxx),以()作为前后缀,且要去掉最后的 ,
    (xxx,xxx,xxx ,)加黑的 , 就是要去除掉的,防止SQL报错执行失败

    详情:在以上 sql 动态解析时,会将第⼀个 trim 部分做如下处理:

    • 基于 prefix 配置,开始部分加上 (
    • 基于 suffix 配置,结束部分加上 )
    • 多个 if 组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于 suffixOverrides 配置去掉最后⼀个 ,
    • 注意 if test=“username != null” 中的 username 是传⼊对象的属性

    单元测试如下:
    在这里插入图片描述
    这里假设传入的三个参数都是有值的,拼接的SQL如下:
    在这里插入图片描述
    在这里插入图片描述

    3. where 标签

    where标签最主要的作用:实现查询中的where SQL替换的,它可以实现如果没有任何的查询条件,那么它可以去除查询中的where SQL;如果存在查询条件时,那么会生成where的SQL查询;并且使用where标签可以自动去除 最前面 的一个 and 字符。

    where标签就是用户做条件查询时候的动态拼接;
    比如在查询用户时候,输入查询条件就根据条件进行查询,如果没有输入查询条件就视为查询全部这种业务需求。

    具体使用如下:
    mapper接口:
    在这里插入图片描述
    xml实现:
    在这里插入图片描述
    在这里插入图片描述
    这两种写法单元测试如下:
    当传入有id,根据id查询时:
    在这里插入图片描述
    能够正确查询出id为1的用户记录:
    在这里插入图片描述
    当传入id为null时,也就是不传id的业务:
    在这里插入图片描述
    也能够正确查询出数据库中全部记录(博主测试时候为了方便打印输出数据表中就只有一个用户):
    在这里插入图片描述
    同时,这个where标签等价于 :
    trim prefix=“where” prefixOverrides=“and” 标签

    xml实现如下:
    在这里插入图片描述
    单元测试 id为1 或者 null 时情况如上不变,所以 where标签 和 trim标签可做等价替换。

    4. set 标签

    set 标签作用: 根据传⼊的⽤户对象属性来更新⽤户数据,使⽤ set 标签来指定动态内容。
    进行修改操作时,配合 if 标签来处理非必传参数,特点是会自动去除掉最后一个英文逗号(,);

    使用详情如下:
    mapper接口:
    在这里插入图片描述
    xml实现:
    在这里插入图片描述
    单元测试:
    修改id为1的用户信息:
    在这里插入图片描述
    执行结果如下:
    在这里插入图片描述
    数据表记录被成功修改:
    在这里插入图片描述
    和 where 标签一样,set 标签也可以使⽤ trim prefix="set" suffixOverrides="," 替换:
    在这里插入图片描述
    单元测试结果一样,同样能正确拼接SQL:
    在这里插入图片描述
    在这里插入图片描述

    5. foreach 标签

    作用:foreach标签是对集合进行循环的,对集合进⾏遍历时使⽤该标签。

    foreach标签属性介绍:

    • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
    • item:遍历时的每⼀个对象
    • open:语句块开头的字符串
    • close:语句块结束的字符串
    • separator:每次遍历之间间隔的字符串

    使用示例:根据传入的多个用户id进行删除用户信息:
    mapper接口方法声明:
    在这里插入图片描述
    xml实现:
    在这里插入图片描述
    先在数据库中插入三条记录,id分别为下:
    在这里插入图片描述
    单元测试如下:
    在这里插入图片描述
    测试结果(拼接SQL)如下:
    在这里插入图片描述
    执行之后成功删除了id为25 26 27的三条用户记录:
    在这里插入图片描述
    注意事项:
    在这里插入图片描述

    • (五大常用)动态SQL使用讲解完毕 ~
  • 相关阅读:
    3.NVIDIA Deepstream开发指南中文版--Deepstream 环境配置
    Linear Regression in mojo with NDBuffer
    10个自动EDA库功能介绍:几行代码进行的数据分析靠不靠谱
    gunicorn的基本使用
    Spring6(三):面向切面AOP
    webpack原理篇(六十):使用 loader-runner 高效进行 loader 的调试
    Linux debian gdb dump
    神经网络(十六)Pytorch实机运行的一些细节
    【Vim】模式的切换、常用命令总结
    基于python的网络爬虫搜索引擎的设计
  • 原文地址:https://blog.csdn.net/xqs196301/article/details/126450905