动态SQL使用
1. if 标签
判断一个参数是否有值,如果没值,那么就会隐藏 if 中的 sql
语法:
<if test="username!=null"> username==#{username} </if>
表达式:username 的参数是否为空
如果结果为 true,那么拼接的 SQL 就会加上 username=#{username},
如果结果为false,那么 if 标签中的 SQL 就会被省略
2. trim 标签
最主要的作用:去除 SQL 语句前后多余的某个字段
标签属性:
- prefix:表示整个语句块,以prefix的值作为前缀
- suffix:表示整个语句块,以suffix的值作为后缀
- prefixOverrides:表示整个语句块要去除掉的前缀
- suffixOverrides:表示整个语句块要去除掉的后缀
<trim prefix="(" suffix=")" suffixOverrides=","> <if test="xxx"> ... </if> </trim>
3. where 标签
主要作用:实现查询中的 where 替换
<!-- 根据 id 查询用户 --> <select id="getUserById" resultMap="BaseMap"> select * from userinfo <where> <if test="id!=null"> id=#{id} </if> <if test="name!=null"> and username=#{name} </if> </where> </select>
where 中的所有参数都为空,那么 where 的 sql 就不会生产
可以去除掉最前面的 and 标签
以上
<where>
标签也可以使用<trim prefix="where" prefixOverrides="and">
替换4. set标签
主要作用:进行修改操作时,配合 if 来处理非必传传输,特点是会自动去除最后一个英文逗号。
<update id="updateById" parameterType="org.example.model.User"> update user <set> <if test="username != null"> username=#{username}, </if> <if test="password != null"> password=#{password}, </if> <if test="nickname != null"> nickname=#{nickname}, </if> <if test="sex != null"> sex=#{sex}, </if> <if test="birthday != null"> birthday=#{birthday}, </if> <if test="head != null"> head=#{head}, </if> <if test="createTime != null"> create_time=#{createTime}, </if> </set> where id=#{id} </update>
set标签中如果所有参数都是非必传,set会将这些语句隐藏,所有标签都使用逗号也没有问题,set会将逗号去掉(如果传一个值的话逗号会存在)。
以上
<set>
标签也可以使用<trim prefix="set" prefixOverrides=",">
替换5. foreach 标签
主要作用:对集合进行循环。
对集合进⾏遍历时可以使⽤该标签。标签有如下属性:
- collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
- item:遍历时的每⼀个对象
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:每次遍历之间间隔的字符串
<delete id="deleteByIds"> delete from article where id in <foreach collection="list" item="item" open="(" close=")" separator="," > #{item} </foreach> </delete>