9 Commits

Author SHA1 Message Date
杨黄林
0c737b5449 版本号更新为1.13.1 2026-02-28 14:05:57 +08:00
杨黄林
9a018b6af9 修复达梦数据库下自动创建表时不会自动变更更新时间问题 2026-02-28 14:03:58 +08:00
杨黄林
64724de96c 修复pgsql自动创建sql失败问题 2026-01-14 17:45:36 +08:00
杨黄林
8321032918 去掉GBase8c,这个没自己的连接,它的连接是pgsql 2026-01-14 16:42:19 +08:00
杨黄林
28b95468a3 版本号升级到1.13.0 2026-01-14 14:01:34 +08:00
杨黄林
828a7395d2 增加南大通用GBase8c 2026-01-14 14:01:19 +08:00
20ddc4412e 精简代码 2025-06-05 13:17:38 +08:00
c65bd7b36f 代码优化 2025-06-05 12:59:32 +08:00
721cd48d96 支持达梦数据库V8 2025-06-05 12:58:18 +08:00
12 changed files with 63 additions and 43 deletions

View File

@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.yanghuanglin</groupId>
<artifactId>seq</artifactId>
<version>1.11.0</version>
<version>1.13.1</version>
<name>seq</name>
<description>seq</description>
<properties>
@@ -34,6 +34,12 @@
<version>42.7.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.3.140</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>

View File

@@ -3,6 +3,7 @@ package com.yanghuanglin.seq.config;
import com.yanghuanglin.seq.enums.DbType;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
@@ -133,7 +134,8 @@ public class GeneratorConfig {
public DbType getDbType() {
if (this.dbType == null) {
try {
String productName = this.dataSource.getConnection().getMetaData().getDatabaseProductName();
Connection connection = dataSource.getConnection();
String productName = connection.getMetaData().getDatabaseProductName();
this.dbType = DbType.of(productName);
} catch (SQLException e) {
throw new RuntimeException("获取数据库类型失败", e);

View File

@@ -7,10 +7,12 @@ import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.jdbc.datasource.init.ScriptUtils;
import javax.sql.DataSource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
public abstract class SequencesBase {
protected DbType dbType;
@@ -49,7 +51,7 @@ public abstract class SequencesBase {
sql = sql.replaceAll("`seq`", String.format("`%s`", tableConfig.getSeqColumn()));
sql = sql.replaceAll("`create_time`", String.format("`%s`", tableConfig.getCreateTimeColumn()));
break;
case Dameng:
case DM_DBMS:
case PostgreSQL:
case KingbaseES:
sql = sql.replaceAll("\"sequences(_unused|_unlock)\"", String.format("%s$1", tableConfig.getTable()));
@@ -61,6 +63,13 @@ public abstract class SequencesBase {
}
InputStream inputStream = new ByteArrayInputStream(sql.getBytes(StandardCharsets.UTF_8));
ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(new InputStreamResource(inputStream));
if (Objects.equals(dbType.getSeries(), DbType.DM_DBMS.getSeries()) && fileName.endsWith("trigger.sql")) {
// 触发器文件不要通过;分隔,整个文件一起执行
databasePopulator.setSeparator(ScriptUtils.EOF_STATEMENT_SEPARATOR);
} else if (Objects.equals(dbType.getSeries(), DbType.PostgreSQL.getSeries()) && fileName.endsWith("function.sql")) {
// 函数文件不要通过;分隔,整个文件一起执行
databasePopulator.setSeparator(ScriptUtils.EOF_STATEMENT_SEPARATOR);
}
databasePopulator.execute(dataSource);
} catch (IOException e) {
System.err.println("执行SQL文件" + fileName + "失败");
@@ -78,7 +87,7 @@ public abstract class SequencesBase {
case MySQL:
break;
case PostgreSQL:
case Dameng:
case DM_DBMS:
case KingbaseES:
sqlString = sqlString.replaceAll("`(.+?)`", "\"$1\"");
break;

View File

@@ -7,6 +7,8 @@ import com.yanghuanglin.seq.po.Sequences;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.Objects;
/**
* @author yanghuanglin
@@ -56,5 +58,11 @@ public class SequencesDaoImpl extends SequencesBase implements SequencesDao {
@Override
public void createTable() {
this.createTableByFile("create_table_sequences.sql");
if (Objects.equals(dbType.getSeries(), DbType.DM_DBMS.getSeries())) {
this.createTableByFile("create_table_sequences_trigger.sql");
} else if (Objects.equals(dbType.getSeries(), DbType.PostgreSQL.getSeries())) {
this.createTableByFile("create_table_sequences_function.sql");
this.createTableByFile("create_table_sequences_trigger.sql");
}
}
}

View File

@@ -4,7 +4,7 @@ public enum DbType {
//MySQL数据库
MySQL("mysql"),
//达梦数据库
Dameng("dm"),
DM_DBMS("dm"),
//人大金仓数据库
KingbaseES("pgsql"),
//PostgreSQL数据库
@@ -28,7 +28,7 @@ public enum DbType {
*/
public static DbType of(String productName) {
for (DbType value : DbType.values()) {
if (value.name().equalsIgnoreCase(productName)) {
if (value.name().equalsIgnoreCase(productName.replace(" ", "_"))) {
return value;
}
}

View File

@@ -3,24 +3,11 @@ CREATE TABLE IF NOT EXISTS "sequences"
"key" VARCHAR(64) NOT NULL,
"type" VARCHAR(64) NOT NULL,
"seq" BIGINT NOT NULL,
"update_time" TIMESTAMP,
"update_time" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ("key", "type")
);
COMMENT ON TABLE "sequences" IS '当前序号表';
COMMENT ON COLUMN "sequences"."key" IS '序号英文名称';
COMMENT ON COLUMN "sequences"."type" IS '序号类型';
COMMENT ON COLUMN "sequences"."seq" IS '已使用到的序号';
COMMENT ON COLUMN "sequences"."update_time" IS '最后使用时间';
/*
@触发器设置,功能:自动记录更新时间
@触发器名为 SEQUENCES_UPDATE_TIME
@触发器执行范围为每行生效
*/
CREATE OR REPLACE TRIGGER SEQUENCES_UPDATE_TIME BEFORE UPDATE ON "sequences" FOR EACH ROW
BEGIN
NEW."update_time":=SYSDATE;
END;
/*启动触发器*/
ALTER TRIGGER SEQUENCES_UPDATE_TIME ENABLE;
COMMENT ON COLUMN "sequences"."update_time" IS '最后使用时间';

View File

@@ -0,0 +1,8 @@
CREATE OR REPLACE TRIGGER "SEQUENCES_UPDATE_TIME"
BEFORE UPDATE
ON "sequences"
referencing OLD ROW AS "OLD" NEW ROW AS "NEW"
FOR EACH ROW
BEGIN
:NEW."UPDATE_TIME" := CURRENT_TIMESTAMP;
END;

View File

@@ -3,6 +3,6 @@ CREATE TABLE IF NOT EXISTS `sequences`
`key` VARCHAR(64) NOT NULL COMMENT '序号英文名称',
`type` VARCHAR(64) NOT NULL COMMENT '序号类型',
`seq` BIGINT(20) NOT NULL COMMENT '已使用到的序号',
`update_time` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '最后使用时间',
`update_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后使用时间',
PRIMARY KEY (`key`, `type`)
) COMMENT '当前序号表';

View File

@@ -10,23 +10,4 @@ COMMENT ON TABLE "sequences" IS '当前序号表';
COMMENT ON COLUMN "sequences"."key" IS '序号英文名称';
COMMENT ON COLUMN "sequences"."type" IS '序号类型';
COMMENT ON COLUMN "sequences"."seq" IS '已使用到的序号';
COMMENT ON COLUMN "sequences"."update_time" IS '最后使用时间';
/*
触发器函数用户更新update_time字段
*/
CREATE OR REPLACE FUNCTION SEQUENCES_UPDATE_TIME() RETURNS TRIGGER AS $$
BEGIN
NEW."update_time" := current_timestamp;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
/*
@触发器设置,功能:自动记录更新时间
@触发器名为 SEQUENCES_UPDATE_TIME
@触发器执行范围为每行生效
*/
DROP TRIGGER IF EXISTS SEQUENCES_UPDATE_TIME ON "sequences" CASCADE;
CREATE TRIGGER SEQUENCES_UPDATE_TIME BEFORE UPDATE ON "sequences" FOR EACH ROW EXECUTE FUNCTION SEQUENCES_UPDATE_TIME();
COMMENT ON COLUMN "sequences"."update_time" IS '最后使用时间';

View File

@@ -0,0 +1,6 @@
CREATE OR REPLACE FUNCTION SEQUENCES_UPDATE_TIME() RETURNS TRIGGER AS $$
BEGIN
NEW."update_time" := current_timestamp;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

View File

@@ -0,0 +1,2 @@
DROP TRIGGER IF EXISTS SEQUENCES_UPDATE_TIME ON "sequences" CASCADE;
CREATE TRIGGER SEQUENCES_UPDATE_TIME BEFORE INSERT OR UPDATE ON "sequences" FOR EACH ROW EXECUTE PROCEDURE SEQUENCES_UPDATE_TIME();

View File

@@ -5,10 +5,12 @@ import com.yanghuanglin.seq.config.TableConfig;
import com.yanghuanglin.seq.generator.Generator;
import com.yanghuanglin.seq.generator.impl.SequencesGenerator;
import com.yanghuanglin.seq.po.Sequences;
import dm.jdbc.driver.DmdbDataSource;
import org.junit.Test;
import org.postgresql.ds.PGSimpleDataSource;
import javax.sql.DataSource;
import java.sql.DatabaseMetaData;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;
@@ -24,7 +26,7 @@ public class SeqTest {
private static final Generator generator;
static {
dataSource = mysql();
dataSource = dm();
GeneratorConfig generatorConfig = new GeneratorConfig(dataSource);
System.out.println("DbType: " + generatorConfig.getDbType());
@@ -65,6 +67,14 @@ public class SeqTest {
return pgDataSource;
}
private static DataSource dm() {
DmdbDataSource dmdbDataSource = new DmdbDataSource();
dmdbDataSource.setURL("jdbc:dm://127.0.0.1:5236?schema=sequence");
dmdbDataSource.setUser("SYSDBA");
dmdbDataSource.setPassword("SYSDBA");
return dmdbDataSource;
}
@Test
public void createTable() {
generator.createTable();
@@ -137,6 +147,7 @@ public class SeqTest {
@Test
public void lockTest() {
generator.generate("0010001$distrainCode2024","MISSION");
Sequences sequences = new Sequences();
sequences.setKey("0010001$distrainCode2024");
sequences.setType("MISSION");