mybatis postgresql insert后返回自增id

在使用mybatis + postgresql,我们有时在插入数据时需要返回自增id的值,此时在插入时,可以按照以下例子来编写mapper文件

<insert id="insertUser">
    <selectKey resultType="int"  order="AFTER" keyProperty="pid" >
        SELECT currval('tbl_user_pid_seq'::regclass) AS pid
    </selectKey>
    insert into tbl_user(name, age) values(#{name}, #{age})
</insert>

  

转载于:https://www.cnblogs.com/Jeremy2001/p/10756443.html

<think> 首先,用户的问题是:“我想查找MyBatis实现新ID的方法 请问MyBatis实现新ID的方法”。这基于之前的系统级指令和提供的引用。 系统级指令: - 所有行内数学表达式必须使用$...$格式(但这里没有数学表达式,所以可能不适用)。 - 独立公式必须使用$$...$$格式并单独成段(同样,这里可能不适用)。 - LaTeX语法正确(没有数学,所以OK)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 提供的引用: - 引用[1]: 描述了在MyBatis中使用`useGeneratedKeys=true`和`keyProperty`来返回主键。 - 引用[2]: 同上,解释如何获取自ID并将值赋给实体属性。 - 引用[3]: 展示了一个简单的Insert语句。 - 引用[4]: 确认了`useGeneratedKeys`只对Insert语句有效,默认为false,设置为true时返回主键。 用户的问题焦点是实现新ID的方法,即如何在新数据后获取数据库自动生成的ID。 关键点: - 在MyBatis中,通过XML映射文件中配置`<insert>`标签的属性来实现。 - 属性: - `useGeneratedKeys="true"`: 指示MyBatis使用JDBC的getGeneratedKeys方法来获取数据库自动生成的主键。 - `keyProperty="id"`: 指定将获取到的自主键值设置到实体对象的哪个属性中。这里的"id"应该替换为实际实体类的属性名,如`id`或`userId`等。 步骤: 1. 编写Insert语句:确保数据库表的主键是自的(如MySQL的AUTO_INCREMENT)。 2. 在MyBatis的Mapper XML文件中,配置`insert`标签。 3. 添加`useGeneratedKeys="true"`和`keyProperty="属性名"`属性。 4. 在Java代码中,新数据后,实体对象的该属性会被自动填充自ID。 示例代码基于引用: - 引用[1]和[2]提供了清晰的例子。 回答结构: - 步骤清晰:逐步解释如何实现。 - 引用自然:在末尾添加引用标识。 - 生成相关问题:在最后,添加相关问题列表。 语言:中文。 完整回答: - 先阐述方法。 - 给出示例。 - 添加引用。 - 最后生成相关问题。 相关问题生成: - 参考用户的问题和主题,生成相关问题。 - 例如: 1. 如何在非自主键的情况下获取新ID? 2. MyBatis中其他方式返回主键的方法? 3. 常见问题或最佳实践? 最终回答框架: 1. 介绍方法。 2. 详细步骤。 3. 示例代码。 4. 注意事项。 5. 末尾添加引用。 6. 生成相关问题。 </think> ### MyBatis实现新ID的方法 在MyBatis中实现新数据时ID的核心方法是利用MyBatis提供的`useGeneratedKeys`和`keyProperty`属性,结合数据库的自主键机制(如MySQL的AUTO_INCREMENT)。以下是详细的实现步骤和注意事项: #### 1. **配置Mapper XML文件** 在MyBatis的Mapper XML文件中,为`<insert>`标签添加以下属性: - `useGeneratedKeys="true"`:指示MyBatis使用JDBC的`getGeneratedKeys()`方法获取数据库自动生成的主键。 - `keyProperty="属性名"`:指定将自主键值赋给Java实体类的哪个属性(例如`"id"`或`"userId"`)。 示例代码: ```xml <insert id="addUser" parameterType="com.example.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name, pwd) VALUES (#{name}, #{pwd}) </insert> ``` - 此处`keyProperty="id"`对应Java实体类`User`的`id`属性[^1][^2][^4]。 #### 2. **确保数据库表支持自主键** - 数据库表的主键必须设置为自类型(例如MySQL的`AUTO_INCREMENT`或PostgreSQL的`SERIAL`)。 - 示例建表语句(MySQL): ```sql CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), pwd VARCHAR(50) ); ``` #### 3. **Java代码调用** 在Service层或Mapper接口中调用新方法后,自ID会自动填充到实体对象的指定属性中: ```java User user = new User(); user.setName("John"); user.setPwd("123456"); userMapper.addUser(user); // 执行新操作 // 新后直接通过实体对象获取自ID Long generatedId = user.getId(); System.out.println("Generated ID: " + generatedId); ``` - 执行`addUser`后,`user.getId()`会返回数据库生成的自ID[^2][^4]。 #### 4. **注意事项** - **数据库兼容性**:`useGeneratedKeys`仅适用于支持自主键的数据库(如MySQL、PostgreSQL),Oracle等需使用`<selectKey>`替代。 - **属性匹配**:`keyProperty`的值必须与实体类的属性名严格一致(区分大小写)。 - **默认行为**:`useGeneratedKeys`默认为`false`,需显式设置为`true`才生效[^4]。 - **事务安全**:确保操作在事务内执行,以避免主键冲突。 通过以上方法,MyBatis能高效地处理自ID返回,简化开发流程[^1][^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值