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

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

  • mybatis插入数据,记录存在,但是获取不到主键
    • 问题描述:
    • insert配置信息如下:
    • 结论

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等,表示数据库厂家,元素内部可通过来为特定数据库指定不同的sql语句
mapper文件如下:
<mapper namespace="com.OrderDao">
 <cache/>
 <resultMap type="com.Order" id="resultOrder">
 <id column="order_id" property="orderId" jdbcType="INTEGER"/>
 .....
 
<insert id="insert" parameterType="com.Order" useGeneratedKeys="true" keyProperty="order_id">
INSERT INTO demo_order_refund(
<trim suffix="" suffixOverrides=",">         
	<if test="[email protected]@isEmpty(orderId)">order_id,</if>
	<if test="[email protected]@isEmpty(remark)">remark,</if></trim>
)VALUES(
<trim suffix="" suffixOverrides=",">
	<if test="[email protected]@isEmpty(orderId)">#{orderId,jdbcType=INTEGER},
	<if test="[email protected]@isEmpty(remark)">#{remark,jdbcType=VARCHAR},
</trim>
)
</insert>

结论

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

<insert id="insert" parameterType="com.Order" useGeneratedKeys="true" keyProperty="orderId">

你可能感兴趣的:(mysql,mysql)