动态 SQL 提供了更大的灵活性和可重用性,可以根据不同情况生成不同的 SQL 语句,从而满足应用程序的需求。它简化了数据库操作的编写和管理,提高了开发效率和代码的可维护性。
<if>
用于条件判断,根据条件决定是否包含某个SQL片段。
<!--必填和非必填的<if>标签--><insert id="add2">insert into userinfo(id,<if test="name!=null">name,</if>age) values(#{id},<if test="name!=null">#{name},</if>#{age})</insert>
<trim>
提供了一种灵活的方式来去除或添加 SQL 片段的开头或结尾。
<trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">SQL statement or fragment </trim>
可以看出trim有四个属性
- prefix,suffix 添加前缀和后缀;
- prefixOverrides:去掉前缀;suffixOverrides:去掉后缀
<insert id="add3">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="id!=null">id,</if><if test="name!=null">name,</if><if test="age!=null">age,</if><if test="email!=null">email,</if></trim> values<trim prefix="(" suffix=")" suffixOverrides=","><if test="id!=null">#{id},</if><if test="name!=null">#{name},</if><if test="age!=null">#{age},</if><if test="email!=null">#{email},</if></trim></insert>
<where>
<where>需要搭配<if> 使用;
<where>需要删除前面的and;
<where>语句中没有内容的话就不会生成where sql关键字
<select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo <!-- <where>--> <!-- <if test="name!=null">--> <!-- and name=#{name}--> <!-- </if>--> <!-- <if test="id!=null">--> <!-- and id=#{id}--><!-- </if>--> <!-- </where>--><trim prefix="where" prefixOverrides="and"><if test="name!=null">and name=#{name}</if><if test="id!=null">and id=#{id}</if></trim></select>
<select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo<where><if test="name!=null">and name=#{name}</if><if test="id!=null">and id=#{id}</if></where></select>
<select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo<where><if test="name!=null">name=#{name}</if><if test="id!=null">and id=#{id}</if></where></select>
@Testvoid getListByParam() {List<UserInfo> list=userMapper.getListByParam("John",1);//select* from userinfo WHERE name=? and id=?List<UserInfo> list1=userMapper.getListByParam("John",null);// select* from userinfo WHERE name=?List<UserInfo> list2=userMapper.getListByParam(null,1);//select* from userinfo WHERE id=?List<UserInfo> list3=userMapper.getListByParam(null,null);//select* from userinfo}
进行单元测试的时候,当输入null参数,if是null的话就没有where后面的sql语句
<set>
<set>用于动态生成 UPDATE 语句的标签。
在 UPDATE 语句中,我们通常需要根据条件更新表中的某些列。<set> 标签可以帮助我们只更新指定的列,避免全表更新,提高性能和减少网络传输量。
下面是一个使用 <set>标签的示例:
- 配合if使用;
- 会自动去除最后一个逗号
<update id="updateUser" parameterType="User">UPDATE user<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="email != null">email = #{email},</if></set>WHERE id = #{id} </update>
在这个示例中,`<set>` 标签包含了多个 `<if>` 标签。每个 `<if>` 标签表示一个条件,如果条件成立,则生成对应的列更新语句。
最终生成的 SQL 语句会根据实际情况只更新存在值的列,而不会更新为 `null` 的列。
需要注意的是,在生成的 SQL 语句中,最后一个列名后面没有逗号,这是通过在 `<if>` 标签中添加逗号来实现的。
<foreach>
item:指定在循环体内每个元素的别名。
index:指定在循环体内每个元素的索引(即下标)。
collection:指定要遍历的集合或数组对象。
open:指定循环体前要添加的字符。
close:指定循环体后要添加的字符。
separator:指定每个元素之间要添加的分隔符。<delete id="dels"> <!--delete from userinfo where id in ()-->delete from userinfo where id in<foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach></delete>