java生成sequence

本文介绍在Spring框架下如何使用DataFieldMaxValueIncrementer接口通过序列和表字段来生成数据库主键值,涵盖Oracle序列和MySQL自增键的具体配置。

根据不同的主键产生方式,可能需要配置表名、主键字段名或序列名等信息。下面,我们以Oracle和MySql为例分别讲解使用序列及表字段产生主 键值的方式。

  DataFieldMaxValueIncrementer接口定义了3个获取下一个主键值的方法:

  l int nextIntValue():获取下一个主键值,主键数据类型为int;

  l long nextLongValue():获取下一个主键值,主键数据类型为long;

  l String nextStringValue():获取下一个主键值,主键数据类型为String;

 

一般数据库都提供了自增键的功能,如MySql的auto_increment、SqlServerr的identity字段等。Spring允许你在应 用层产生主键值,为此定义了 org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer 接口,提供两种产生主键的方案:第一,通过序列产生主键;第二,通过表产生主键。

 

Oracle :

 

<bean id="incre" class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer">

<property name="incrementerName" value="seq_post_id"/> ①指定序列名

<property name="dataSource" ref="dataSource"/> ②设置数据源

</bean>

 

MySQL :

 

<bean id="incre"

class="org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer">

<property name="incrementerName" value="t_post_id"/> ①设置维护主键的表名

<property name="columnName" value="sequence_id"/>②用于生成主键值的列名

<property name="cacheSize" value="10"/> ③缓存大小

<property name="dataSource" ref="dataSource"/>

</bean>

### Java 中实现 Sequence ID 生成方法 #### 使用 Snowflake 算法生成唯一 ID Snowflake 是 Twitter 开源的一种分布式自增主键生成算法,能够保证全局有序性和唯一性。通过 `SnowflakeIdGenerator` 类可以方便地生成唯一的长整型 ID。 ```java import com.twitter.snowflake.SnowflakeIdGenerator; public class Main { public static void main(String[] args) { SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1L); // 设置机器ID for (int i = 0; i < 10; i++) { long id = idGenerator.generateId(); System.out.println("Generated ID: " + id); } } } ``` 此代码展示了如何创建一个基于特定工作节点的实例,并连续调用其 `generateId()` 方法来获取一系列不重复的数值[^1]。 #### 基于 MySQL 的 Sequence 实现 对于依赖数据库的应用程序来说,可以通过 JDBC 访问存储过程或表结构中的序列字段来进行 ID 生产操作。下面是一个利用 MyBatis Plus 提供的支持雪花算法分配策略的例子: ```xml <generator name="ASSIGN_ID"> <!-- 配置雪花算法 --> </generator> ``` 当配置好之后,在实体映射文件里指定主键生成方式即可自动完成赋值动作[^4]。 #### Hibernate 自定义 Generator 方案 如果项目采用的是 ORM 框架如 Hibernate,则可通过扩展框架自带的功能来自定义主键生产逻辑。这里给出了一种名为 `IDSequenceGenerator` 的解决方案,它允许开发者灵活控制每条记录所对应的编号规则。 ```java @GenericGenerator( name = "idGenerator", strategy = "cn.izern.hibernate.id.IDSequenceGenerator" ) @Id @GeneratedValue(generator = "idGenerator") private Long id; ``` 上述片段说明了怎样注册一个新的 generator 并将其应用到具体属性上,从而确保每次新增对象时都能获得独一无二的身份标识符[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值