Compare commits
9 Commits
e2e5939810
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c737b5449 | ||
|
|
9a018b6af9 | ||
|
|
64724de96c | ||
|
|
8321032918 | ||
|
|
28b95468a3 | ||
|
|
828a7395d2 | ||
| 20ddc4412e | |||
| c65bd7b36f | |||
| 721cd48d96 |
8
pom.xml
8
pom.xml
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 '最后使用时间';
|
||||
8
src/main/resources/dm/create_table_sequences_trigger.sql
Normal file
8
src/main/resources/dm/create_table_sequences_trigger.sql
Normal 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;
|
||||
@@ -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 '当前序号表';
|
||||
@@ -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 '最后使用时间';
|
||||
@@ -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;
|
||||
@@ -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();
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user