公司使用的orm框架為ibatis,其中默認的insert語句一直都是這樣寫的:
1 <insert id="insert" parameterClass="activityDO" > 2 insert into activity_expert ( 3 ...... 4 activity_id , 5 ...... 6 ) 7 values( 8 ...... 9 #activityId# , 10 ...... 11 ) 12 </insert>
很常規的寫法對吧!
假設其中activity_id是不可為null的,在寫表結構時默認如果為null,則activity_id=99。
總體來看,insert語句是沒有問題的,如果activity_id不為null,則正常入庫,如果為null,還有默認值default=99,但是實際上卻並不是這樣的,如果對象中的activityId為null,程序會報錯。
經查閱,上述的規則其實是不正確的,正確的規則如下:
在insert語句中,如果顯式地插入NULL值(如:insert into test values (null))到被聲明了NOT NULL的列,則將會報錯,不允許插入;而如果是隱式地插入NULL值(如:insert into test values ())到被聲明了NOT NULL的列,列應該被設置為它的缺省值,如果它有缺省值的話,否則報錯,無法插入。
因此在ibatis中寫insert語句的最佳方式如下:
1 <sql id="common_condition"> 2 ...... 3 <isNotEmpty prepend="," property="activityId" removeFirstPrepend="true">activity_id = #activityId# </isNotEmpty> 4 ...... 5 </sql> 6 7 <insert id="insert" parameterClass="activityExpertDO" > 8 insert into activity set 9 <include refid="common_condition" /> 10 </insert>
這樣做一方面可以解決上述表中某些字段不能為null,但傳遞參數卻又有可能為null的情況,另外一方面可以復用sql語句,在insert和update的sql語句中都可以使用。
