记录下动态sql的常用标签:
1.where
一般用作数据操作添加的条件
例子:
<select id="selectByRoleId" resultMap="resource">
select * from resource <where> role_id = #{roleId} </where>
2.if
一般用做查询,修改或者删除数据时的一些拼接条件。
test字段为判断条件
例子:
<select id="findCountByContditon" resultType="int" parameterType="com.example.demo.po.User">
select coalesce(count(id),0) from user <where> <if test="name != null and name != ''"> name like #{name} </if> <if test="createTime != null"> and create_time < #{createTime} </if> </where> </select>
上面的sql有个问题,就是如果name条件不成立,creatTime条件成立,那么sql会报错。一般如果在where条件下有多个if判断,在if前加入where 1=1。
<select id="findCountByContditon" resultType="int" parameterType="com.example.demo.po.User">
select coalesce(count(id),0) from user <where> 1=1 <if test="name != null and name != ''"> and name like #{name} </if> <if test="createTime != null"> and create_time < #{createTime} </if> </where> </select>
3.foreach
一般用来批量添加数据
collection字段一般为list、array、map类型,值为传入的参数
separator字段值为分隔符,即以什么来分割
item 字段为循环时每个元素的别名
index 字段值为每次循环时的下标
open 字段值为前缀值
close 字段值为后缀值
例子:
<insert id="saveAll" parameterType="java.util.List">
insert into user(name,role_id,password) values <foreach collection="users" separator="," item="user" index="index" > ( #{user.name}, #{user.roleId}, #{user.password}) </foreach> </insert>
4.set
一般用在修改数据,与if经常一起出现
<update id="updateByCondition">
update user
<set> <if test="name != null and name != ''"> name = #{name}, </if> <if test="password != null and password != ''"> password = #{password}, </if> <if test="createTime != null"> create_time = @{createTime} </if> </set> where id = #{id} </update>
5.include
一般是将常用的字段抽出来作为常量
<sql id="user_columns">
id, name,role_id,password,create_time,update_time
</sql>
<select id="selectById" resultMap="user">
select <include refid="user_columns"/> from user where id = #{id} </select>
6.trim
prefix字段前缀添加值
suffix字段后缀添加值
prefixOverrides字段删除前缀值
suffixOverrides字段删除后缀值
<update id="updateByCondition">
update user set
<trim suffixOverrides=","> <if test="name != null and name != ''"> name = #{name}, </if> <if test="password != null and password != ''"> password = #{password}, </if> <if test="createTime != null"> create_time = @{createTime}, </if> </trim> where id = #{id} </update>
如果password为空,其他不为空。sql变为
update user set name = #{name}, create_time = #{createTime} where id = #{id }