如何使JDBC插入数据的时候返回自动增长的主键值

本文详细介绍了在Java中如何使用PreparedStatement进行数据插入,并通过设置Statement.RETURN_GENERATED_KEYS来获取自动生成的主键值。示例代码展示了完整的操作流程,包括执行SQL语句、设置参数、执行更新及检索生成的主键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常插入数据时的代码如下:

...
String sql = "insert into table (name) values(?)"; 
PreparedStatement pstmt = conn.prepareStatement(sql);
// 如果使用静态的SQL,则不需要动态插入参数 
pstmt.setString(1, name); 
pstmt.executeUpdate(); 
...

如果想要获取自动增长的主键值,代码如下:

String sql = "insert into table (name) values(?)"; 
// 指定返回生成的主键 
PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
// 如果使用静态的SQL,则不需要动态插入参数 
pstmt.setString(1, name); 
pstmt.executeUpdate(); 
// 检索由于执行此 Statement 对象而创建的所有自动生成的键 
ResultSet rs = pstmt.getGeneratedKeys(); 
if (rs.next()) { 
    Int id = rs.getInt(1);//主键的数据类型为int
}
...

rs.getInt(1)的返回值即是返回的主键值。
 

 

 

### MyBatis 插入数据返回生成的 ID 的使用方法 在 MyBatis 中,可以通过配置 `<insert>` 标签的属性 `useGeneratedKeys` 和 `keyProperty` 来实现插入数据返回生成的主键 ID。以下是详细的说明和示例: #### 1. `useGeneratedKeys` 属性 此属性用于指示 MyBatis 是否应该使用 JDBC 的 `getGeneratedKeys()` 方法来获取数据自动生成的主键。如果设置为 `true`,则表示启用该功能。 #### 2. `keyProperty` 属性 此属性指定了将生成的主键映射到 Java 对象的哪一个字段。通常情况下,它会指向实体类中的主键字段名称。 --- ### MySQL 数据库示例 假设有一个名为 `query_rate_config` 的表,其结构如下: ```sql CREATE TABLE query_rate_config ( id INT AUTO_INCREMENT PRIMARY KEY, code VARCHAR(50), partner_type TINYINT, search_count INT, booking_count INT, ticket_count INT, rate_type TINYINT ); ``` 对应的 MyBatis 映射文件可以这样定义: ```xml <insert id="insertQueryRateConfig" parameterType="com.demo.domain.CountRateConfig" useGeneratedKeys="true" keyProperty="id"> INSERT INTO query_rate_config (code, partner_type, search_count, booking_count, ticket_count, rate_type) VALUES (#{code,jdbcType=VARCHAR}, #{partnerType,jdbcType=TINYINT}, #{searchCount,jdbcType=INTEGER}, #{bookingCount,jdbcType=INTEGER}, #{ticketCount,jdbcType=INTEGER}, #{rateType,jdbcType=TINYINT}) </insert> ``` 在此配置中,`useGeneratedKeys="true"` 表明启用了自增主键的功能,而 `keyProperty="id"` 则表明生成的主键会被赋给传入参数对象的 `id` 字段[^2]。 --- ### Oracle 数据库示例 对于不支持自动增长主键数据库(如 Oracle),可以借助序列(Sequence)和触发器(Trigger)或者通过 `<selectKey>` 标签手动获取主键。 以下是一个基于 Oracle 序列的例子: ```xml <insert id="insertMessageComment" parameterType="com.erp.oa.entity.MessageCommentDO"> <selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE"> SELECT SEQ_MESSAGE_COMMENT.NEXTVAL FROM DUAL </selectKey> INSERT INTO message_comment (ID, comment_man, comment_detail, insert_time) VALUES (#{id,jdbcType=INTEGER}, #{commentMan,jdbcType=INTEGER}, #{commentDetail,jdbcType=VARCHAR}, SYSDATE) </insert> ``` 在这个例子中,`<selectKey>` 被用来提前生成主键,并将其赋给 `id` 字段。注意这里的 `order="BEFORE"` 表示在执行插入语句之前先生成主键[^4]。 --- ### 返回解释 - **影响行数**:默认情况下,MyBatis 的 `<insert>` 操作返回的是受影响的行数,而不是生成的主键。 - **主键**:要获取生成的主键,必须显式地配置 `useGeneratedKeys=true` 或者使用 `<selectKey>` 标签。 --- ### 注意事项 1. 如果使用了 `useGeneratedKeys=true`,那么 `<selectKey>` 是多余的,两者不可同存在。 2. 不同数据库对主键生成的支持方式不同,需根据具体数据库特性调整配置。 3. 确保实体类中有与 `keyProperty` 匹配的字段名,否则无法正确接收生成的主键。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值