虽然DDL里写了fund_batch_no varchar(30) NOT NULL DEFAULT ''
,但mybatis里是下面这么写的:
SQL
<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,那么你可以设置它为默认值(在这种情况下,是空字符串)。比如:
SQL
<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映射文件变得相当复杂,特别是当你有很多字段需要处理时。比如:
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>