mybatis插入数据后获取不到主键
发布日期:2021-05-14 23:43:45 浏览次数:15 分类:精选文章

本文共 1544 字,大约阅读时间需要 5 分钟。

mybatis插入数据后获取不到主键

mybatis插入数据,记录存在,但是获取不到主键

问题描述:

1.GoodsOrder order = this.setOrder(remark…));//此步骤对要插入的对象进行赋值(除了主键,数据库设置的主键自增)

2.dao.insert(order);//插入到数据库中
3.Integer orderId = order.getOrderId();//此处拿到的值为null

通过以上第一步赋值实体类,第二步将实体类插入到数据库,第三步获取刚刚插入的记录的主键id. 数据库插入数据成功,但是获取不主键ID,得到的是null.

可以确定的是,插入sql语句是没有问题的,因为数据库是有最新记录的.其次主键id是在插入后才有的,所以应该是框架中返回的,所以要看下框架对insert配置的信息.

insert配置信息如下:

  • parameterType ,入参的全限定类名或类型别名
  • keyColumn ,设置数据表自动生成的主键名。对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置
  • keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中
  • useGeneratedKeys ,取值范围true|false(默认值),设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。MySQL和SQLServer执行auto-generated - key field,因此当数据库设置好自增长主键后,可通过JDBC的getGeneratedKeys方法获取。但像Oralce等不支持auto-generated key field的数据库就不能用这种方法获取主键了
  • statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE
  • flushCache ,取值范围true(默认值)|false,设置执行该操作后是否会清空二级缓存和本地缓存
  • timeout ,默认为unset(依赖jdbc驱动器的设置),设置执行该操作的最大时限,超时将抛异常
  • databaseId ,取值范围oracle|mysql等,表示数据库厂家,元素内部可通过<if test="_databaseId = 'oracle'">来为特定数据库指定不同的sql语句
mapper文件如下:
.....
INSERT INTO jpgk_taolin_order_refund(
order_id,
remark,
)VALUES(
#{orderId,jdbcType=INTEGER},
#{remark,jdbcType=VARCHAR},
)

结论

主键设置的自动递增,由于使用了useGeneratedKeys=true,使用JDBC的getGenereatedKeys方法获取主键值并赋值给keyProperty,这个keyProperty表示的是代码中的字段属性,而不是表中的字段属性.在插入数据后获取罪行的字段值keyProperty字段值原值为order_id,正确的值应该为orderId

上一篇:UTF-8编码格式设置
下一篇:微信公众号测试账号总结

发表评论

最新留言

很好
[***.229.124.182]2025年04月10日 04时46分13秒