MyBatis | Insert null 错误,Column xxx cannot be null,即使数据库DDL里写了DEFAULT ‘‘

虽然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对象itemfundBatchNo属性为null,那么它将尝试插入一个null值。尽管你在数据库DDL中设置了默认值,但是MyBatis在这种情况下并不会自动使用这个默认值,这是因为你的SQL语句是明确地插入了一个值(在这种情况下,是null),而不是省略了这个值(在这种情况下,数据库才会使用默认值)。

所以为了避免插入null,你需要确保你的Java对象itemfundBatchNo属性是非空的。如果你想要在fundBatchNo为null的情况下使用默认值,你需要在Java代码中实现这个逻辑。

  1. 更好的方式是在java代码里处理null值。

  2. 如果在 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>
  1. 如果在 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>
相关推荐
tatasix41 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98763 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言3 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring