二、<set> 标签 用于增删改
改 直接写法:
<update id = 'update'>
update flower set name=#{name}, production=#{production} where id = #{id}
</update>
对应Java测试代码:
Flower f=new Flower();
f.setName("bjsxt");
f.setId(9);
FlowerMapper mapper = sqlSession.getMapper(FlowerMapper.class);
mapper.update(f)
问题一:输入的对象f中的production属性为空,导致sql执行失败
改进:
<!--Set 会自动增加set关键字,并且去除最后一个逗号-->
<update id="update">
UPDATE flower
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="production!=null and production!=''">
production=#{production},
</if>
</set>
where id=#{id}
</update>
执行后的日志输出:并没有拼接production
对应Java测试代码:
Flower f=new Flower();
f.setId(9);
FlowerMapper mapper = sqlSession.getMapper(FlowerMapper.class);
mapper.update(f)
问题二:输入的对象f中的name和production属性均为空,执行改进后的代码,日志输出为:
报错了,因为此时只有where条件却没有set修改的属性,导致set关键没有被添加。
可以在<set>标签内添加id = #{id}这个特殊的set执行语句防止执行错误
<!--Set 会自动增加set关键字,并且去除最后一个逗号-->
<update id="update">
UPDATE flower
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="production!=null and production!=''">
production=#{production},
</if>
id=#{id}
</set>
where id=#{id}
</update>
trim标签
可以通过trim添加前缀实现set和select的功能
<!--
trim:
prefix:添加前缀
prefixOverrides:去除前缀
suffix:添加后缀
suffixOverrides:去除后缀
-->
<update id="update2">
UPDATE flower
<!--添加前缀set 去掉后缀的逗号,不仅可以添加set这个前缀-->
<trim prefix="set" suffixOverrides=",">
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="production!=null and production!=''">
production=#{production}
</if>
</trim>
where id=#{id}
</update>