在使用 MyBatis 框架插入数据并返回新插入记录的主键(通常是Id)时,可以通过以下几种方式来实现。
### 1. 使用 `<insert>` 元素的 `useGeneratedKeys` 和 `keyProperty` 属性
如果数据库支持自动生成主键(例如 MySQL 的 `AUTO_INCREMENT`),那么可以在 MyBatis 的映射文件中设置 `<insert>` 元素的 `useGeneratedKeys` 属性为 `true` 并指定 `keyProperty` 属性为实体类中的属性名。这样 MyBatis 就会使用 JDBC 的 `getGeneratedKeys` 方法来获取插入后的主键值,并将其赋给实体对象。
#### 示例:
```xml
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (username, password)
VALUES (#{username}, #{password})
</insert>
```
在这个例子中,假设 `users` 表有一个自增的 `id` 字段,MyBatis 会在插入操作完成后自动将生成的 `id` 值设置到传入的对象中对应的 `id` 属性上。
### 2. 使用 `selectKey` 元素
对于不支持自动生成主键的数据库,或者你需要在插入之前就确定主键的情况,可以使用 `<selectKey>` 元素来明确地定义如何获取主键值。`<selectKey>` 可以配置在 `<insert>` 语句内部,并且需要指明结果应该存储到实体对象的哪个属性中。
#### 示例:
```xml
<insert id="insertUser">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT SEQ_USER.NEXTVAL AS id FROM dual
</selectKey>
INSERT INTO users (id, username, password)
VALUES (#{id}, #{username}, #{password})
</insert>
```
在这个例子中,`SEQ_USER` 是一个序列对象,它用来生成新的主键值。`order="BEFORE"` 表示在执行插入语句之前先执行这个查询来获取主键值。
### 注意事项
- 确保你的数据库和表结构支持你所选择的获取主键的方法。
- 如果是使用 `useGeneratedKeys`,则确保数据库驱动程序支持此功能。
- 当使用 `selectKey` 时,注意它的 `order` 属性,这决定了是在插入前还是插入后执行获取主键的语句。
- 在 Java 代码中调用插入方法时,记得传递一个可变的参数对象(如 Java Bean 或 Map),以便它可以接收返回的主键值。
以上就是利用 MyBatis 插入数据并返回主键 Id 的基本方法。根据你的具体需求和技术栈的不同,可能还需要做一些额外的配置或调整。