数据库插入记录返回自增id

本文介绍在MyBatis中如何实现主键自增,包括使用useGeneratedKeys和keyProperty属性进行配置的方法,以及在Oracle数据库中通过序列实现类似功能的方式。

在mybatis 的映射文件中,设置两个属性。

useGeneratedKeys="true" keyProperty="id"

例如:

<!-- 向订单中插入商品 -->
	<insert id="insertGoods" parameterType="com.self.modules.order.entity.OrderEntity" 
useGeneratedKeys="true" keyProperty="id">
		insert into [order](gId,userId,buyNum) values(#{gId},#{userId},#{buyNum})
	</insert>

在orcale中不支持自增。它是用序列来模拟自增的。

<insert id="insertGoods" parameterType="com.self.modules.order.entity.OrderEntity" databaseId="orcale">
		<selectKey keyProperty="id" order="BEFORE" resultType="Integer">
			select EMPLOYEES_SEQ.nextval from [order]
		</selectKey>
		insert into [order](EMPLOYEE_ID,gId,userId,buyNum) values(#{id},#{gId},#{userId},#{buyNum})
</insert>

它是先拿到记录的最大值+1,再插入的。

### 数据库插入数据时ID的实现方式 在数据库中实现插入数据时ID的功能,可以通过多种方式完成。以下详细介绍几种常见的实现方式及其适用场景。 #### 1. 使用数据库自带的自功能 大多数关系型数据库(如MySQL、达梦数据库等)都支持自字段的功能。这种功能通常通过定义表结构时设置主键字段为`AUTO_INCREMENT`或类似属性来实现[^1]。 - **MySQL中的实现** 在MySQL中,可以通过在创建表时将某个字段设置为`AUTO_INCREMENT`来实现自功能。例如: ```sql CREATE TABLE t_order ( id INT AUTO_INCREMENT PRIMARY KEY, orderno VARCHAR(50), money DECIMAL(10, 2), hid INT, msid INT, startdate DATE, enddate DATE, created_at DATETIME, eid INT, status CHAR(1) ); ``` 这样每次插入数据时,`id`字段会自动递[^2]。 - **达梦数据库中的实现** 达梦数据库同样支持自字段,但需要明确指定生成策略。例如使用`IDENTITY`列类型: ```sql CREATE TABLE t_order ( id BIGINT IDENTITY PRIMARY KEY, orderno VARCHAR(50), money DECIMAL(10, 2), hid INT, msid INT, startdate DATE, enddate DATE, created_at DATETIME, eid INT, status CHAR(1) ); ``` 在达梦数据库中,`IDENTITY`字段可以确保每次插入数据时,`id`字段自动递[^1]。 #### 2. 使用序列(Sequence) 对于不直接支持`AUTO_INCREMENT`的数据库,可以通过创建序列(Sequence)并结合触发器或手动调用序列值的方式来实现自功能。 - **创建序列** 在达梦数据库中,可以通过以下语句创建一个序列: ```sql CREATE SEQUENCE seq_order_id START WITH 1 INCREMENT BY 1 NOMAXVALUE; ``` - **插入数据时使用序列** 插入数据时,可以显式调用序列的下一个值: ```sql INSERT INTO t_order (id, orderno, money, hid, msid, startdate, enddate, created_at, eid, status) VALUES (seq_order_id.NEXTVAL, 'ORD123', 100.00, 1, 2, '2023-10-01', '2023-10-31', NOW(), 1, '0'); ``` #### 3. 使用UUID或其他唯一标识符 如果对性能要求不高,或者希望避免自ID可能带来的并发问题,可以考虑使用UUID作为主键。UUID是全局唯一的标识符,不会出现重复的情况。 - **示例代码** 在MySQL中可以直接使用`UUID()`函数生成唯一标识符: ```sql INSERT INTO t_order (id, orderno, money, hid, msid, startdate, enddate, created_at, eid, status) VALUES (UUID(), 'ORD123', 100.00, 1, 2, '2023-10-01', '2023-10-31', NOW(), 1, '0'); ``` #### 4. MyBatis-Plus中的实现方式 在MyBatis-Plus框架中,可以通过配置`useGeneratedKeys`和`keyProperty`来获取数据库自动生成的主键值。例如: ```xml <insert id="addParkOrder" parameterType="com.property.entity.Order" useGeneratedKeys="true" keyProperty="id"> insert into t_order (orderno, money, hid, msid, startdate, enddate, created_at, eid, status) values (#{orderno}, #{money}, #{hid}, #{msid}, #{startdate}, #{enddate}, now(), #{eid}, '0') </insert> ``` 上述配置适用于MySQL数据库。但在达梦数据库中,由于其对`useGeneratedKeys`的支持有限,可能需要额外处理以确保主键值能够正确返回。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值