虽然DDL里写了fund_batch_no varchar(30) NOT NULL DEFAULT ''
,但mybatis里是下面这么写的:
<insert id="batchInsert"> insert into repay_detail_tab ( fund_batch_no) values <foreach collection="repayDetails" item="item" separator=","> ( #{item.fundBatchNo,jdbcType=VARCHAR} ) </foreach>
</insert>
在MyBatis的XML映射文件中使用的插入语句显然是在为fund_batch_no
列插入明确的值。在这种情况下,#{item.fundBatchNo,jdbcType=VARCHAR}
会将fundBatchNo
的值(这是你的Java对象item
的属性)插入到fund_batch_no
列。如果你的Java对象item
的fundBatchNo
属性为null,那么它将尝试插入一个null值。尽管你在数据库DDL中设置了默认值,但是MyBatis在这种情况下并不会自动使用这个默认值,这是因为你的SQL语句是明确地插入了一个值(在这种情况下,是null),而不是省略了这个值(在这种情况下,数据库才会使用默认值)。
所以为了避免插入null,你需要确保你的Java对象item
的fundBatchNo
属性是非空的。如果你想要在fundBatchNo
为null的情况下使用默认值,你需要在Java代码中实现这个逻辑。
-
更好的方式是在java代码里处理null值。
-
如果在 xml 文件里处理,你可以在设置
fundBatchNo
属性之前检查它是否为null,如果是null,那么你可以设置它为默认值(在这种情况下,是空字符串)。比如:
<insert id="batchInsert">insert into repay_detail_tab (fund_batch_no, no_check_column1, no_check_column2) values <foreach collection="repayDetails" item="item" separator=",">(<choose><when test="item.fundBatchNo != null">#{item.fundBatchNo,jdbcType=VARCHAR}</when><otherwise>''</otherwise></choose>,#{item.noCheckColumn1,jdbcType=VARCHAR},#{item.noCheckColumn2,jdbcType=VARCHAR})</foreach>
</insert>
-
如果在 xml 文件里处理,也可以在null时直接不插入改字段,使用DDL里的DEFAULT逻辑。
你需要为每个字段添加一个
<if>
块,这可能会使你的SQL映射文件变得相当复杂,特别是当你有很多字段需要处理时。比如:
<insert id="batchInsert"><foreach collection="repayDetails" item="item" separator=";">INSERT INTO repay_detail_tab <trim prefix="(" suffix=")" suffixOverrides=","><if test="item.fundBatchNo != null">fund_batch_no,</if><!-- Add more fields here --></trim>VALUES<trim prefix="(" suffix=")" suffixOverrides=","><if test="item.fundBatchNo != null">#{item.fundBatchNo,jdbcType=VARCHAR},</if><!-- Add more fields here --></trim></foreach>
</insert>