Mybatis动态SQL用法

动态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=",">

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MyBatis动态SQL是一种基于OGNL表达式的技术,可以在SQL语句实现一些逻辑判断。总体上,MyBatis动态SQL主要包含以下几类语句: 1. if语句:用于简单的条件判断。 2. choose语句(相当于Java语言的switch):包含when和otherwise子句,类似于JSTL的choose语句。 3. trim语句:在包含的内容上添加前缀或后缀,可以用于动态地拼接SQL语句。 4. where语句:主要用于简化SQL语句的where条件判断,能够智能地处理and和or,防止多余导致语法错误。 5. set语句:主要用于更新操作。 6. foreach语句:在实现MyBatis的in语句查询时特别有用。 以上是MyBatis动态SQL的几种主要用法,可以根据具体需求选择适合的方式来编写动态SQL语句。 MyBatis Dynamic SQL是一个与MyBatis配套的项目,它解决了MyBatis动态SQL方面的一些缺点,并提供了更灵活、强大的动态SQL功能。该项目可以帮助开发人员更方便地编写复杂的SQL语句,提高开发效率。你可以在官方文档了解更多关于MyBatis Dynamic SQL的信息。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [真正的Mybatis动态sqlMyBatis Dynamic SQL](https://blog.csdn.net/qq_36534560/article/details/119931287)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [mybatis动态sql及分页](https://blog.csdn.net/hjzhzhshhs/article/details/125241823)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值