动态SQL:MyBatis强大的特性之一

发布时间:2024年01月24日

一般来说,一个程序的服务器可以部署多个,但是数据库却只能有一个。这么多服务器,如果每天都要给数据库海量的操作数据,数据库的压力就会非常大。

所以为了减轻数据库的压力,我们可以把一些查询数据库的语句简化,并且把简化的这个部分放在服务器中执行,这样数据库的压力就小很多。当然这只是一个特性之一,动态sql还有很多的优点就不一一列举了。

常见的动态SQL标签:

  • <if>
  • <trim>
  • <where>
  • <choose> <when> <otherwise>
  • <set>
  • <foreach>

<if>标签

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

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

简单地说,<if> 标签就是判断条件中的test条件,如果成立就拼接if语句,否则就不拼接:

//if 不成立
select * from userinfo where 1=1
//if 成立
select * from userinfo where 1=1 and id=#{id}

在数据库中,如果不输入这个id,就默认表示查询所有的数据,加上了id才表示只查询id的那个人。

<trim>标签

有的时候不仅仅只有一个条件需要判定是否为空,可能所有的条件都需要判定为空,那么就会出现sql语句被拼接的多出来where条件或者其他的字段。我们就需要使用<trim>标签来解决,采用<trim>来结合<if>标签。

  • prefix:表示整个语句块,以prefix的值作为前缀,以下演示为 (
  • suffix:表示整个语句块,以suffix的值作为后缀,以下演示为 )
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀,以下演示为 ,
    <select id="getUserById" resultType="com.example.spring_mvc.entity.UserEntity">
        select * from userinfo
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="username!=null and username !='' ">
                    username,
                </if>
                <if test="password!=null and password!='' ">
                    password,
                </if>
            </trim>
        values
            <trim prefix="(" suffix=")" suffixOverrides=",">
                <if test="username!=null and username !='' ">
                    #{username},
                </if>
                <if test="password!=null and password!='' ">
                    #{password},
                </if>
            </trim>
    </select>

<where>标签

在前面,我们使用了if标签来表示where中的条件,但是因为if标签的不完美,所以还需要加一个1=1这样的条件。我们还可以使用where标签直接把where当成一个条件来使用:

<where>还能够去除条件中第一个and。

如果where标签内没有内容,则在SQL语句中直接不会显示where条件。

<set>标签

出现在update语句,和where语句类似,只有当set标签里面有内容的时候才会出现set

<foreach>标签

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

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

我们以删除语句为例子:

delete from userinfo where id in(1,2,3);

那么使用了for each标签后,可以变成:

collection是mapper中传的形参名,item是接收的参数名。

    int deleteById(List<Integer> List);

文章来源:https://blog.csdn.net/m0_62319039/article/details/135829256
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。