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
相关产品推荐
相关产品推荐

