在使用ibatis技术提交爱哦数据时,往往会碰到数据库中设置为 Not Null,且有默认值,原本以为页面上不需要输入就可以保存,但经过多次测试都会报错!
后面发现,问题出在ibatis生成的xml映射中InSert Into T1(C1,C2,...,Cn) values(#V1#,#V2#,...,#Vn#)中,当提交到数据库时给数据库发送了“InSert Into T1(C1,C2,...,Cn)
values ( id, null,...,null) ”命令,虽然数据库中C2,Cn不能为Null,也有默认值,但当V2,Vn为空时就会报错。
在开发时总结出以下几种办法处理默认值提交的问题:
第一类方法:程序代码处理:
1. Action中给from的默认字段赋值,提交到后台什就有了初始值;
2. Service提交之前给对象的各方法赋初始值,提交到数据库就用了初始值;
第二类方法:xml映射处理:
3. xml中改为动态SQL语句:
<sql id="T1Columns">
<trim suffixOverrides=",">
<if test="C1!= null">C1,</if>
<if test="C2 != null">C2,</if>
<if test="Cn != null">Cn</if>
</trim>
</sql>
<sql id="T1Values">
<trim suffixOverrides=",">
<if test="C1 != null">#{C1},</if>
<if test="C2 != null">#{C2},</if>
<if test="Cn!= null">#{Cn}</if>
</trim>
</sql>
<insert id="insertT1" parameterType="dto">
insert into T1(<include refid="T1Columns"/>)
values (<include refid="T1Values"/>)
</insert>
4. xml <Insert>中对字段进行判断
insert into T1(C1,C2,...Cn) values(
id,
<isNull property="C2">
'defaultValue'
</isNull>
<isNotNull property="C2">
#C2#
</isNotNull>
,...,
<isNull property="Cn">
'defaultValue'
</isNull>
<isNotNull property="Cn">
#Cn#
</isNotNull>
)
第三类方法:页面赋值:
5. 页面上提交之前赋值,这样提交到后台就有值了
经过测试第四种方法比较好,所以我推荐使用,有空的时候把ibatis重新改写以下,这样自动生成的xml中就有了!