From 956e70739939256ea503b5749eaab1a846a599d6 Mon Sep 17 00:00:00 2001 From: yhl452493373 Date: Fri, 11 Feb 2022 14:45:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=BB=98=E8=AE=A4=E5=BA=8F?= =?UTF-8?q?=E5=8F=B7=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 35 +++++++++++++------ pom.xml | 2 +- .../seq/config/GeneratorConfig.java | 13 +++++++ .../yanghuanglin/seq/generator/Generator.java | 18 ++++++++-- .../generator/impl/SequencesGenerator.java | 14 ++++++-- 5 files changed, 66 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 38bd3b8..2690928 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 使用方法: -+ 在项目中放置jar包的地方把seq-1.2.0.jar、seq-1.2.0-sources.jar、seq-1.2.0-pom.xml复制过去 ++ 在项目中放置jar包的地方把seq-1.3.1.jar、seq-1.3.1-sources.jar、seq-1.3.1-pom.xml复制过去 + 在pom.xml中增加以下内容,然后执行maven命令:mvn clean ```xml @@ -18,7 +18,7 @@ com.yanghuanglin seq - 1.2.0 + 1.3.1 @@ -33,7 +33,7 @@ - + @@ -50,13 +50,13 @@ - ${project.basedir}/lib/seq-1.2.0.jar - ${pom.basedir}/lib/seq-1.2.0-pom.xml - ${project.basedir}/lib/seq-1.2.0-sources.jar + ${project.basedir}/lib/seq-1.3.1.jar + ${pom.basedir}/lib/seq-1.3.1-pom.xml + ${project.basedir}/lib/seq-1.3.1-sources.jar default com.yanghuanglin seq - 1.2.0 + 1.3.1 jar true @@ -279,7 +279,8 @@ GeneratorConfig配置项,通过set方法设置 | transactionManager | org.springframework.jdbc.datasource.DataSourceTransactionManager | null | 事务管理器 | | autoCreate | Boolean | true | 开启自动建表 | | step | Integer | 1 | 序号增加时的步长 | -| tableConfig | com.yanghuanglin.seq.config.TableConfig | TableConfig的默认配置 | 表配置 | +| type | String | DEFAULT | 默认序号类型 | +| tableConfig | com.yanghuanglin.seq.config.TableConfig | TableConfig的默认配置 | 表配置 | 以上配置中,jdbcTemplate和transactionTemplate优先级最高,如果jdbcTemplate、transactionTemplate、dataSource、transactionManager同时配置,则dataSource和transactionManager无效; 进行这几种组合:dataSource+autoCreate+step+tableConfig,jdbcTemplate+transactionTemplate+autoCreate+step+tableConfig,jdbcTemplate+transactionManager+autoCreate+step+tableConfig @@ -290,6 +291,7 @@ Generator方法如下: ```java package com.yanghuanglin.seq.generator; +import com.yanghuanglin.seq.config.GeneratorConfig; import com.yanghuanglin.seq.po.Sequences; import com.yanghuanglin.seq.po.SequencesUnlock; import com.yanghuanglin.seq.po.SequencesUnused; @@ -314,6 +316,19 @@ public interface Generator { */ String SEQ = "#seq#"; + /** + * 根据传入的key和type生成可用的序号对象。 + *

+ * 如果根据key和默认的{@link GeneratorConfig#getType()}在{@link Sequences}中找不到记录,说明该组合的序号对象还未初次生成,返回的是seq为step的序号对象,该对象数据会写入到{@link SequencesUnlock}中。 + *

+ * 如果根据key和默认的{@link GeneratorConfig#getType()}在{@link Sequences}中找到了记录,且在{@link SequencesUnused}也找到了记录,说明该组合生成的序号有部分未使用,返回的是{@link SequencesUnused}中找到的seq最小的序号对象。同时会将{@link SequencesUnused}中找到的seq最小的记录删除,然后写入到{@link SequencesUnlock}中。 + *

+ * + * @param key 数据字典中的编码 + * @return 可用的序号对象 + */ + Sequences generate(String key); + /** * 根据传入的key和type生成可用的序号对象。 *

@@ -386,7 +401,7 @@ public interface Generator { /** * 将已格式化的序号解析为序号对象 *

- * 返回的序号对象{@link Sequences#getKey()}和{@link Sequences#getType()}为null,但是临时字段{@link Sequences#getYear()}、{@link Sequences#getMonth()}、{@link Sequences#getDay()}可能有值 + * 返回的序号对象{@link Sequences#getKey()}为null,{@link Sequences#getType()}为{@link GeneratorConfig#getType()}的默认值,但是临时字段{@link Sequences#getYear()}、{@link Sequences#getMonth()}、{@link Sequences#getDay()}可能有值 *

* 如果生成序号时,序号的key在年、月、日上有关联(如每年每月的序号要从1开始),则需要自行用序号字符串与{@link Sequences#getYear()}、{@link Sequences#getMonth()}、{@link Sequences#getDay()}进行组合,进而得到key *

@@ -396,7 +411,7 @@ public interface Generator { * * @param formatted 格式化后的序号字符串 * @param pattern 序号格式 - * @return 包含了序号字符串对应年(如果有)、月(如果有)、日(如果有)、序号的序号对象,其key、type需要根据情况手动设置 + * @return 包含了序号字符串对应年(如果有)、月(如果有)、日(如果有)、序号的序号对象,其key需要根据情况手动设置,type为{@link GeneratorConfig#getType()}的默认值 */ Sequences parse(String formatted, String pattern); diff --git a/pom.xml b/pom.xml index 41c7224..faca844 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.yanghuanglin seq - 1.2.1 + 1.3.1 seq seq diff --git a/src/main/java/com/yanghuanglin/seq/config/GeneratorConfig.java b/src/main/java/com/yanghuanglin/seq/config/GeneratorConfig.java index d8224f1..ca98e55 100644 --- a/src/main/java/com/yanghuanglin/seq/config/GeneratorConfig.java +++ b/src/main/java/com/yanghuanglin/seq/config/GeneratorConfig.java @@ -43,6 +43,11 @@ public class GeneratorConfig { */ private Integer step = 1; + /** + * 默认序号类型 + */ + private String type="DEFAULT"; + /** * 表和字段配置 */ @@ -95,6 +100,14 @@ public class GeneratorConfig { this.autoCreate = autoCreate; } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + public Integer getStep() { return step; } diff --git a/src/main/java/com/yanghuanglin/seq/generator/Generator.java b/src/main/java/com/yanghuanglin/seq/generator/Generator.java index 55e7d85..862fbbb 100644 --- a/src/main/java/com/yanghuanglin/seq/generator/Generator.java +++ b/src/main/java/com/yanghuanglin/seq/generator/Generator.java @@ -1,5 +1,6 @@ package com.yanghuanglin.seq.generator; +import com.yanghuanglin.seq.config.GeneratorConfig; import com.yanghuanglin.seq.po.Sequences; import com.yanghuanglin.seq.po.SequencesUnlock; import com.yanghuanglin.seq.po.SequencesUnused; @@ -24,6 +25,19 @@ public interface Generator { */ String SEQ = "#seq#"; + /** + * 根据传入的key和type生成可用的序号对象。 + *

+ * 如果根据key和默认的{@link GeneratorConfig#getType()}在{@link Sequences}中找不到记录,说明该组合的序号对象还未初次生成,返回的是seq为step的序号对象,该对象数据会写入到{@link SequencesUnlock}中。 + *

+ * 如果根据key和默认的{@link GeneratorConfig#getType()}在{@link Sequences}中找到了记录,且在{@link SequencesUnused}也找到了记录,说明该组合生成的序号有部分未使用,返回的是{@link SequencesUnused}中找到的seq最小的序号对象。同时会将{@link SequencesUnused}中找到的seq最小的记录删除,然后写入到{@link SequencesUnlock}中。 + *

+ * + * @param key 数据字典中的编码 + * @return 可用的序号对象 + */ + Sequences generate(String key); + /** * 根据传入的key和type生成可用的序号对象。 *

@@ -96,7 +110,7 @@ public interface Generator { /** * 将已格式化的序号解析为序号对象 *

- * 返回的序号对象{@link Sequences#getKey()}和{@link Sequences#getType()}为null,但是临时字段{@link Sequences#getYear()}、{@link Sequences#getMonth()}、{@link Sequences#getDay()}可能有值 + * 返回的序号对象{@link Sequences#getKey()}为null,{@link Sequences#getType()}为{@link GeneratorConfig#getType()}的默认值,但是临时字段{@link Sequences#getYear()}、{@link Sequences#getMonth()}、{@link Sequences#getDay()}可能有值 *

* 如果生成序号时,序号的key在年、月、日上有关联(如每年每月的序号要从1开始),则需要自行用序号字符串与{@link Sequences#getYear()}、{@link Sequences#getMonth()}、{@link Sequences#getDay()}进行组合,进而得到key *

@@ -106,7 +120,7 @@ public interface Generator { * * @param formatted 格式化后的序号字符串 * @param pattern 序号格式 - * @return 包含了序号字符串对应年(如果有)、月(如果有)、日(如果有)、序号的序号对象,其key、type需要根据情况手动设置 + * @return 包含了序号字符串对应年(如果有)、月(如果有)、日(如果有)、序号的序号对象,其key需要根据情况手动设置,type为{@link GeneratorConfig#getType()}的默认值 */ Sequences parse(String formatted, String pattern); diff --git a/src/main/java/com/yanghuanglin/seq/generator/impl/SequencesGenerator.java b/src/main/java/com/yanghuanglin/seq/generator/impl/SequencesGenerator.java index ff7d001..96fc5e9 100644 --- a/src/main/java/com/yanghuanglin/seq/generator/impl/SequencesGenerator.java +++ b/src/main/java/com/yanghuanglin/seq/generator/impl/SequencesGenerator.java @@ -30,6 +30,7 @@ public class SequencesGenerator implements Generator { private final SequencesUnusedDao sequencesUnusedDao; private final SequencesUnlockDao sequencesUnlockDao; private final Integer step; + private final String type; public SequencesGenerator(GeneratorConfig generatorConfig) { //数据库操作模板 @@ -66,6 +67,7 @@ public class SequencesGenerator implements Generator { this.sequencesUnusedDao = new SequencesUnusedDaoImpl(jdbcTemplate, generatorConfig.getTableConfig()); this.sequencesUnlockDao = new SequencesUnlockDaoImpl(jdbcTemplate, generatorConfig.getTableConfig()); this.step = generatorConfig.getStep(); + this.type = generatorConfig.getType(); autoCreateTable(generatorConfig.getAutoCreate()); } @@ -81,6 +83,11 @@ public class SequencesGenerator implements Generator { this.sequencesUnlockDao.createTable(); } + @Override + public synchronized Sequences generate(String key) { + return generate(key, type); + } + @Override public synchronized Sequences generate(String key, String type) { return transactionTemplate.execute(status -> { @@ -227,6 +234,7 @@ public class SequencesGenerator implements Generator { sequences.setMonth(StringUtils.hasLength(month) ? Integer.valueOf(month) : null); sequences.setDay(StringUtils.hasLength(day) ? Integer.valueOf(day) : null); sequences.setSeq(StringUtils.hasLength(seq) ? Long.parseLong(seq) : 0L); + sequences.setType(type); return sequences; } @@ -239,7 +247,7 @@ public class SequencesGenerator implements Generator { } @Override - public void release() { + public synchronized void release() { //列出所有使用中表存在的序号 List sequencesUnlockList = sequencesUnlockDao.listAll(); @@ -255,7 +263,7 @@ public class SequencesGenerator implements Generator { } @Override - public void release(Date begin, Date end) { + public synchronized void release(Date begin, Date end) { //列出指定时间段内使用中表存在的序号 List sequencesUnlockList = sequencesUnlockDao.listByDate(begin, end); @@ -271,7 +279,7 @@ public class SequencesGenerator implements Generator { } @Override - public void release(Sequences sequences) { + public synchronized void release(Sequences sequences) { sequencesUnlockDao.delete(new SequencesUnlock(sequences)); sequencesUnusedDao.save(new SequencesUnused(sequences)); }