一般来说,一个程序的服务器可以部署多个,但是数据库却只能有一个。这么多服务器,如果每天都要给数据库海量的操作数据,数据库的压力就会非常大。
所以为了减轻数据库的压力,我们可以把一些查询数据库的语句简化,并且把简化的这个部分放在服务器中执行,这样数据库的压力就小很多。当然这只是一个特性之一,动态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);