Mybatis动态SQL用法

news/2024/7/5 2:44:43

动态SQL是Mybatis的一大重要特性,它可以完成不同条件下的SQL拼接,降低了因为SQL语句书写中的小错误而造成程序报错的概率,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号,利用动态SQL就可以解决这些难题。

常见动态SQL标签:

  1. <if>
  2. <where>
  3. <choose> <when> <otherwise>
  4. <set>
  5. <foreach>
  6. <trim>

目录

实体类及数据库相关配置

实体类

 数据库连接配置

数据库数据 

标签

sql语句

测试结果

标签

sql语句

测试结果

choose> 标签

sql语句

测试结果

标签

sql语句

测试结果

标签

sql语句

测试结果

 标签

 标签可以替换其他标签


实体类及数据库相关配置

实体类

@Data   //加上lombok注解 方便对实体类进行操作
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
}

 数据库连接配置

# 配置数据库连接
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/blog?characterEncoding=utf8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# 设置日志级别
logging:
  level:
    com:
      example:
        demo: debug

mybatis:
  # 配置 mybatis xml 文件的保存路径
  mapper-locations: classpath:/mybatis/**Mapper.xml
  # 开启 MyBatis SQL 打印
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

数据库数据 

<if>标签

作用:判断一个参数是否有值,如果没有值就会隐藏if中的sql语句

sql语句

    <select id="getUserById" resultType="com.example.demo.model.UserInfo">
        select * from userinfo where 1= 1
        <if test="id!=null">
            and id=#{id}
        </if>
    </select>

测试结果

输入id:

 不传入id:

 传入id时,就会拼接if标签内的sql语句,否则不进行拼接。

<where>标签

上述使用if语句进行查询时我们加了一个条件where 1=1,这个语句是为了保证语句成立的,不至于程序报错,但是Mybatis中设计了更好的方法,就是把<where>也作为一个标签元素,从而达到动态添加where的效果

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

sql语句

    <select id="getUserById" resultType="com.example.demo.model.UserInfo">
        select * from userinfo
        <where>
            <if test="id!=null">
                and id=#{id}
            </if>
        </where>
    </select>

测试结果

传入id:

 不传入id:

 在查找时,如果传入id就会拼接条件查询的语句,否则不拼接查询表内所有数据。

choose> <when> <otherwise>标签

在使用< if >元素时,只要test属性中的表达式为true,就会执行元素中的条件语句,但是在实际应用中,有时只需要从多个选项中选择一个去执行。在这种场景下,使用< if > 元素进行处理是非常不合理的。如果使用的是Java语言,这种情况显然更适合switch语句来处理,那么MyBatis中有没有类似的语句呢?当然是有的。针对上面的情况,MyBatsi可以用< choose >,< when >,< otherwise >元素组合去实现上面的情况

作用:从多个选项中选择一个去进行sql语句的拼接

sql语句

    <select id="getUserByChoose" resultType="com.example.demo.model.UserInfo">
        select * from userinfo
        <where>
            <choose>
                <when test="id!=null">
                    id=#{id}
                </when>
            </choose>
            <choose>
                <when test="username!=null">
                    username=#{username
                </when>
            </choose>
            <choose>
                <when test="password!=null">
                    password=#{password}
                </when>
            </choose>
        </where>
    </select>

测试结果

 当条件满足其中一项时后面就不会再去匹配,这里id匹配正确就会停止后面username以及password的匹配(不管这两个字段是否匹配成功),当所输入的字段均不能被匹配也可以使用<otherwise>标签返回默认值。

<set>标签

作用:进行修改操作时,配合if标签来处理非必要传输,会自动去除最后一个英文逗号

sql语句

    <update id="update">
        update userinfo
        <set>
            <if test="id!=null">
                id=#{id},
            </if>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="password!=null">
                password=#{password}
            </if>
        </set>
        where id=#{id}
    </update>

测试结果

<foreach>标签

作用:对集合进行循环

<foreach>标签中的主要属性介绍:

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

sql语句

    <delete id="deleteByIds">
        delete from userinfo where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete>

测试结果

 <trim>标签

作用:相当于替换,也可以去除 SQL 语句前后多余的某个字符

<trim>标签中的主要属性介绍:

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

 <trim>标签可以替换其他标签

<where> 等于 <trim prefix="where" prefixOverrides="and">

<set> 等于 <trim prefix="set" suffixOverrides=",">


http://lihuaxi.xjx100.cn/news/1103427.html

相关文章

B-Tree B-树 代码介绍-20230505(C语言)

B-Tree B-树 代码介绍-20230505&#xff08;C语言) 前言 前面已经介绍B-树属于多路查找树&#xff0c;它在数据库和文件储存系统设计中有着广泛的应用&#xff0c;B-Tree的基本操作包含查询、插入和删除等基本操作&#xff0c;由于这些操作过程中&#xff0c;B-树必须恪守其基…

信奥一本通1242

1242&#xff1a;网线主管 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 25297 通过数: 6122 【题目描述】 仙境的居民们决定举办一场程序设计区域赛。裁判委员会完全由自愿组成&#xff0c;他们承诺要组织一次史上最公正的比赛。他们决定将选手的电脑用星形拓扑…

实验一 进程管理与进程同步

实验一 进程管理与进程同步 实验目的&#xff1a; 了解进程管理的实现方法&#xff0c;理解和掌握处理进程同步问题的方法。 实验内容&#xff1a; 实现银行家算法、进程调度过程的模拟、读者-写者问题的写者优先算法。 实验步骤&#xff1a; 1.银行家算法流程图 &…

pytorch矩阵乘法总结

1. element-wise&#xff08;*&#xff09; 按元素相乘&#xff0c;支持广播&#xff0c;等价于torch.mul() a torch.tensor([[1, 2], [3, 4]]) b torch.tensor([[2, 3], [4, 5]]) c a*b # 等价于torch.mul(a,b) # tensor([[ 2, 6], # [12, 20]]) a * torch.tenso…

不废话!CentOS 8 安装docker的详细过程

目录 1.更新系统 2. 安装依赖包 3.添加 Docker YUM 仓库 4.安装 Docker 5.启动 Docker 6.设置 Docker 开机自启 7.测试 Docker 1.更新系统 dnf update 这里直接输入y&#xff0c;耐心等待更新即可 直到看到complete表示更新完毕 2. 安装依赖包 Docker 需要一些依赖包才能正常…

Django框架之模型自定义管理器

类属性 objects 是manager类的一个对象&#xff0c;作用是与数据库进行交互。 当定义模型类没有指定管理器&#xff0c;django会为模型创建objects管理器。 表结构与数据 CREATE TABLE myapp_grades (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) NOT NULL,boy_num…

Kali Linux 配置动态/静态 IP

[笔者系统版本] [Kali]: Kali Linux 2023.1 [Kernel]: kernel 6.1.0 [Desktop]: Xfce 4.18.1 1. Kali Linux 配置动态 IP (1). 首先查看网卡接口名称。 (2). 编辑网络接口配置文件。 (3). 网络接口配置文件的默认内容是这样的。 (4). 新增配置内容如下&#xff1b; 指定网卡…

【Linux】Linux学习之常用命令一

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…