You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis保存实体时如何将数据库默认字段值回写到实体对象

MyBatis 数据库默认字段回写实体方案

可以通过MyBatis原生配置实现,不需要额外调用实体setter方法,也不需要修改现有Mapper接口定义,以下是两种可行方案:

方案1:通用方案(兼容所有数据库)

在insert映射中添加<selectKey>标签,插入完成后主动查询数据库生成的surcharge值回写到实体:

<insert id="saveBundle" parameterType="com.yourpackage.Bundle">
  INSERT INTO bundle (col1, col2
  <if test="surcharge != null">
    , surcharge
  </if>
  ) VALUES (#{col1}, #{col2}
  <if test="surcharge != null">
    , #{surcharge}
  </if>
  )
  <!-- 插入后查询surcharge回写实体 -->
  <selectKey keyProperty="surcharge" resultType="boolean" order="AFTER">
    SELECT surcharge FROM bundle WHERE id = #{id}
  </selectKey>
</insert>

注意替换SQL中的主键字段、表名、实体包路径为你实际的业务值。keyProperty指定要回写的实体属性名,MyBatis会通过反射自动赋值,无需手动调用setter。

方案2:精简方案(适配MySQL/PostgreSQL等支持返回生成列的数据库)

直接使用useGeneratedKeys和keyProperty配置,无需额外写查询语句:

<insert id="saveBundle" parameterType="com.yourpackage.Bundle" useGeneratedKeys="true" keyProperty="id,surcharge">
  INSERT INTO bundle (col1, col2
  <if test="surcharge != null">
    , surcharge
  </if>
  ) VALUES (#{col1}, #{col2}
  <if test="surcharge != null">
    , #{surcharge}
  </if>
  )
</insert>

keyProperty支持填写多个字段,用逗号分隔,MyBatis会把数据库自动生成的主键、surcharge默认值依次回写到传入的实体对象对应属性中。

两种方案都不需要修改原有void saveBundle(Bundle bundle)接口定义,插入执行完成后直接读取传入的bundle对象的surcharge属性即可拿到数据库写入的真实值。

内容的提问来源于stack exchange,提问作者Maksym Rybalkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:36:04