Mybatis中需要将插入的序列返回

最近开发遇到需要插入一张表的数据后,若此表有序列(ORACL
E),需要获取此主键并传到另一张表做关联。可在sqlMapper中增加以下配置
<pre name="code" class="html"><insert id="add" parameterType="vo.Category">

<selectKey resultType="java.lang.Short" order="BEFORE" keyProperty="id">

SELECT SEQ_TEST.NEXTVAL FROM DUAL

</selectKey>

insert into category (name_zh, parent_id,

show_order, delete_status, description

)

values (#{nameZh,jdbcType=VARCHAR},

#{parentId,jdbcType=SMALLINT},

#{showOrder,jdbcType=SMALLINT},

#{deleteStatus,jdbcType=BIT},

#{description,jdbcType=VARCHAR}

)

</insert>

其中order的参数为AFTER试用于Mysql,返回的主键或序列值会自动装配到传入的实体中



                
<think>好的,用户想知道如何在MyBatis插入操作后返回生成的实体对象。首先,我需要回忆MyBatis的相关功能,尤其是插入操作后的处理。 记得MyBatis的XML映射文件中,插入语句可以使用useGeneratedKeys和keyProperty属性来获取自动生成的主键。比如,如果数据库表的主键是自增的,配置这两个属性可以将生成的主键赋给实体对象的对应字段。例如: <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, email) VALUES (#{name}, #{email}) </insert> 这样,插入完成后,传入的User对象的id属性会被自动设置。不过,用户可能需要整个实体对象,而不仅仅是主键。这时候,可能需要查询数据库获取完整数据,或者在插入后直接使用参数对象,因为其他字段可能已经在应用层设置好了。 另外,有些数据库Oracle不支持自增主键,而是使用序列。这时候需要使用<selectKey>标签来获取生成的主键。例如: <insert id="insertUser"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> SELECT user_seq.nextval FROM dual </selectKey> INSERT INTO user (id, name, email) VALUES (#{id}, #{name}, #{email}) </insert> 这里在插入前获取序列,并设置到id属性中。这样插入后,实体对象的id就有了。 用户的问题可能还涉及到如何确保其他自动生成的字段(如创建时间)也被填充到实体对象中。这时候可能需要插入后再次查询,或者数据库触发器在插入时生成这些字段,然后通过SELECT语句获取。例如,在MySQL中可以使用LAST_INSERT_ID()函数,或者在插入后执行一次查询: <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, email) VALUES (#{name}, #{email}) <selectKey resultType="com.example.User" keyProperty="id" order="AFTER"> SELECT * FROM user WHERE id = LAST_INSERT_ID() </selectKey> </insert> 不过,这样可能不太常见,通常useGeneratedKeys和keyProperty已经足够获取主键,其他字段可能需要应用层自己处理,或者在插入语句中包含所有字段的,避免依赖数据库生成。 另外,注意MyBatis的配置中,参数对象的属性是否匹配。例如,如果实体类没有对应的构造函数或setter方法,可能会导致错误,如引用[2]中的构造方法找不到的问题。需要确保实体类有正确的构造方法或setter,以便MyBatis能够注入生成的。 总结一下,步骤应该是: 1. 在插入语句中使用useGeneratedKeys和keyProperty获取自增主键。 2. 对于非自增主键,使用<selectKey>获取序列或生成的。 3. 插入后,传入的实体对象会自动填充主键。 4. 若需要其他生成的字段,可能需要再次查询或使用数据库特性返回完整数据。 可能用户还想知道如何验证是否成功获取对象,或者处理批量插入的情况,这些可以作为相关问题提出。</think>### 使用MyBatis返回插入操作后的实体对象 在MyBatis返回插入操作后生成的实体对象,主要通过以下两种方式实现: --- #### 1. **通过自增主键回填** 适用于数据库支持自增主键(如MySQL的`AUTO_INCREMENT`,PostgreSQL的`SERIAL`)。 在XML映射文件中,通过`useGeneratedKeys`和`keyProperty`属性将生成的主键回填到实体对象的对应字段中。 **示例代码:** ```xml <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, email) VALUES (#{name}, #{email}) </insert> ``` - **`useGeneratedKeys="true"`**:启用自动生成的主键回填功能。 - **`keyProperty="id"`**:将生成的主键赋给参数对象(如`User`实体)的`id`属性[^1]。 插入操作后,传入的`User`对象会自动填充`id`字段: ```java User user = new User("Alice", "alice@example.com"); mapper.insertUser(user); // 插入后user.getId()即为生成的主键 ``` --- #### 2. **通过`<selectKey>`标签获取生成** 适用于不支持自增主键数据库(如Oracle使用序列),或需要获取其他自动生成的字段(如时间戳)。 **Oracle序列示例:** ```xml <insert id="insertUser"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> SELECT user_seq.nextval FROM dual </selectKey> INSERT INTO user (id, name, email) VALUES (#{id}, #{name}, #{email}) </insert> ``` - **`order="BEFORE"`**:在插入语句执行前获取序列并赋给`id`字段[^1]。 **获取其他生成字段(如创建时间):** ```xml <insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, email, create_time) VALUES (#{name}, #{email}, NOW()) <selectKey keyProperty="createTime" resultType="java.util.Date" order="AFTER"> SELECT create_time FROM user WHERE id = #{id} </selectKey> </insert> ``` - **`order="AFTER"`**:在插入后查询生成的时间戳并赋给`createTime`字段。 --- #### 注意事项 - **实体类需包含对应字段的Setter方法**:若缺少Setter方法或构造函数不匹配,会抛出`ExecutorException`(参考引用[2])。 - **批量插入时**:需确保`keyProperty`支持集合类型(如`List<User>`)。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值