Ibatis insert語句插入null引發的錯誤


公司使用的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語句中都可以使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM