很久没有写过数据层相关的代码了, 今天突然想起来写个demo试试, 结果碰到这个case, 记录一下.
issue info
java.sql.SQLException: Field 'id' doesn't have a default value
issue 重现
Mybatis 配置中使用如下方式进行insert
<insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.example.demo_mybatis01.entity.User" useGeneratedKeys="true">
insert into user
(username, password, type)
values
(#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR})
</insert>
使用的是支持逐渐自增功能的数据库, 例如mysql/sqlserver等, 这样mybatis默认会调用数据库的主键生成策略, 但是我在创建表的时候没有声明主键自增策略, 所以当代码执行到Insert的时候就会报错.
issue fix
方案一
在数据库中添加主键生成策略, 比如自增策略, 重新执行代码即可.
方案二
在代码中手动实现主键生成策略, 调用insert方法的时候直接将主键插入即可.
方案比较
小型系统, 单数据库当时还是推荐方案一.
分布式, 多数据库等复杂系统推荐使用自定义主键生成策略或者数据库中间件来实现.