1、今天公司项目提交更新表单出错,这个bug交给了我。
2、OK,debugger一下,发现提交的时候后台打印出错,提示大概就是这样 SQLException '17004' 其实很简单,这种错误一般都是说某一列传进来的值为null,因此报错,所以追踪下去,发现是update语句没有做动态传值处理,也就是说需要写成动态sql语句
3、那么Mybatis的动态sql语句是怎么样的呢?
update TableName
<trim prefix="set" suffixOverrides=",">
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<if test=" XX!=null and XX!='' ">
XX = #{xx,jdbcType='varchar'},
</if>
<trim>
4、解释一下<trim>
官方文档大概意思:<trim>节点标签:trim主要功能是可以在Trim包含的内容前加上某些前缀(prefix),也可以在Trim包含的内容之后加上某些后缀(suffix)还可以把Trim包含内容的首部的某些内容忽略掉(prefixOverrides)
,也可以把Trim包含的内容的尾部的某些内容忽略掉(suffixOverrides)
<trim prefix="set" suffixOverrides=",">
所以这行代码的意思是:在前面加上set,去掉最后的逗号。
5、既然都说到update动态sql了那么顺便回顾一下其他动态sql的写法。
6、查询
SELECT XX, XX
FROM TableName
WHERE 1=1
<if test="XX !=null and XX!='' ">
ADN XX LIKE CONCAT(CONCAT('%', #{XX,
jdbcType=varchar}),'%') --模糊查询
</if>
<if test="XX != null and XX != '' ">
AND XX = #{XX, jdbcType=INTEGER}
</if>
</if>
7、增加
insert into TableName
(
<trim suffixOverrides=",">
<if test="xx!=null and xx!=''">
xx,
</if>
<if test="xx!=null and xx!=''">
xx,
</if>
</trim>
)
values
(
<trim suffixOverrides=",">
<if test="xx!=null and xx!=''">
#{xx},
</if>
<if xx="name!=null and xx!=''">
#{xx},
</if>
</trim>
)
8、删除
delete from TableName where xx in
<!-- foreach用于迭代数组元素
open表示开始符号
close表示结束符号
seprator表示元素间的分割符
items表示迭代的数组
-->
<foreach collection="array"
open="(" close=")"
separator="," item="xx">
#{xx}
</foreach>
9、有问题欢迎指出,谢谢