动态 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>
@Test void 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>