diff --git a/src/main/java/com/gcc/airbase/conscript/action/AbstractInitDataBase.java b/src/main/java/com/gcc/airbase/conscript/action/AbstractInitDataBase.java index 923def9203274fb85ab256c3a408e65090a9e7de..c7822e02015fb0facced2eea62b99b250ee32816 100644 --- a/src/main/java/com/gcc/airbase/conscript/action/AbstractInitDataBase.java +++ b/src/main/java/com/gcc/airbase/conscript/action/AbstractInitDataBase.java @@ -1,12 +1,12 @@ package com.gcc.airbase.conscript.action; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.resource.ClassPathResource; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.gcc.airbase.conscript.model.BaseVersionSQL; import com.gcc.airbase.conscript.model.ConscriptProperties; import com.gcc.airbase.conscript.model.DataBaseProperties; import com.gcc.airbase.conscript.util.SQLUtil; @@ -23,6 +23,7 @@ import java.util.*; @Slf4j public abstract class AbstractInitDataBase implements InitDataBase { + private BaseVersionSQL baseVersionSQLUtil; public Connection commConn = null; @@ -39,6 +40,7 @@ public abstract class AbstractInitDataBase implements InitDataBase { public AbstractInitDataBase(DataBaseProperties dataBaseProperties,ConscriptProperties conscriptProperties){ this.conscriptProperties = conscriptProperties; this.dataBaseProperties = dataBaseProperties; + this.baseVersionSQLUtil = new BaseVersionSQL(conscriptProperties.getTableName()); } /** @@ -51,11 +53,13 @@ public abstract class AbstractInitDataBase implements InitDataBase { */ public abstract void initDbConn(); + /** - * 建库语句 - * @return String + * 创建数据库实例 + * @return Boolean */ - public abstract String createDataBaseSQL(); + public abstract boolean createDataBase(); + @Override public boolean isInitEd() { @@ -71,7 +75,7 @@ public abstract class AbstractInitDataBase implements InitDataBase { if(testConnection()){ log.info("【Conscript】Database initialization :Successfully established a connection to the database."); Map sqlcontent; - if(databaseIsExitd(commConn)) { + if(databaseIsExist(commConn)) { initDbConn(); if(!exitDbVersionTable(dbConn)){ createDbVersionTable(); @@ -100,17 +104,16 @@ public abstract class AbstractInitDataBase implements InitDataBase { close(); } - @Override - public boolean testConnection() { - return null != commConn; - } - @Override - public Float getCurrenDbVersion(){ + /** + * 获取当前数据库版本号 + * @return Float + */ + private Float getCurrenDbVersion(){ float version = 0f; try { Statement stmt = dbConn.createStatement(); - ResultSet res = stmt.executeQuery("SELECT version FROM "+ conscriptProperties.getTableName()); + ResultSet res = stmt.executeQuery(this.baseVersionSQLUtil.builderSelectVersionSQL()); if(res.next()){ version = Float.parseFloat(res.getString("version")); }else{ @@ -123,14 +126,22 @@ public abstract class AbstractInitDataBase implements InitDataBase { return version; } - @Override - public boolean excuteSQL(Map sqlcontent) throws SQLException { + /** + * 执行初始化SQL语句 + * @param sqlcontent sql内容 + * @return Boolean + * @throws SQLException + */ + private boolean excuteSQL(Map sqlcontent) throws SQLException { String fileName = "Conscript"; try { dbConn.setAutoCommit(false); Statement stmt = dbConn.createStatement(); for (Map.Entry entry : sqlcontent.entrySet()) { - fileName = entry.getKey().split("&")[1]; + String[] mixtureKeys = entry.getKey().split("&"); + fileName = mixtureKeys[1]; + String version = mixtureKeys[0]; + String desc = mixtureKeys[2]; log.info("【Conscript】Database initialization :Upgrading sql file ——>{}",fileName); String[] sqls = entry.getValue().split(";"); for(String sql:sqls){ @@ -146,7 +157,7 @@ public abstract class AbstractInitDataBase implements InitDataBase { stmt.executeBatch(); dbConn.commit(); stmt.clearBatch(); - updateDbVersion(entry.getKey().split("&")[0]); + updateDbVersion(version,fileName,desc,sqls.length); dbConn.commit(); } log.info("【Conscript】Database initialization :version:"+getLatestVersion()); @@ -159,33 +170,11 @@ public abstract class AbstractInitDataBase implements InitDataBase { } return false; } - - - @Override - public boolean createDataBase() { - try { - Statement stmt = commConn.createStatement(); - stmt.execute(createDataBaseSQL()); - stmt.close(); - }catch (Exception e){ - log.error("【Conscript】Create {} Database Failed !!",dataBaseProperties.getDbName()); - return false; - } - return true; - } - - @Override - public void updateDbVersion(Object version) throws SQLException { - if(null == version){ - version = getLatestVersion(); - } - Statement state = dbConn.createStatement(); - state.execute("UPDATE "+conscriptProperties.getTableName()+" SET version = "+version+" , create_time = '"+ DateUtil.now()+"'"); - state.close(); - } - - @Override - public void close() throws SQLException{ + /** + * 关闭数据库连接 + * @throws SQLException + */ + private void close() throws SQLException{ if(null != commConn){ commConn.close(); commConn = null; @@ -196,6 +185,31 @@ public abstract class AbstractInitDataBase implements InitDataBase { } } + /** + * 数据库是否连接 + * @return Boolean + */ + private boolean testConnection() { + return null != commConn; + } + + /** + * 执行版本库升级 + * @param version 版本号 + * @param sqlFile sql文件 + * @param desc 描述 + * @param sqlSize sql数量 + * @throws SQLException + */ + private void updateDbVersion(Object version,String sqlFile,String desc,int sqlSize) throws SQLException { + if(null == version){ + version = getLatestVersion(); + } + Statement state = dbConn.createStatement(); + state.execute(baseVersionSQLUtil.builderInsertDbVersionSQL(String.valueOf(version),desc,sqlFile,sqlSize)); + // state.execute("UPDATE "+conscriptProperties.getTableName()+" SET version = "+version+" , create_time = '"+ DateUtil.now()+"'"); + state.close(); + } /** * 确认版本表是否存在 @@ -205,9 +219,9 @@ public abstract class AbstractInitDataBase implements InitDataBase { private Boolean exitDbVersionTable(Connection connection) throws SQLException { Statement statement = connection.createStatement(); try{ - ResultSet res = statement.executeQuery("SELECT version FROM "+ conscriptProperties.getTableName()); + ResultSet res = statement.executeQuery(baseVersionSQLUtil.builderSelectVersionSQL()); if(!res.next() || null == res.getString("version")){ - statement.execute(initDataVersionTableSQL()); + statement.execute(baseVersionSQLUtil.builderInitDbVersionSQL()); statement.close(); } return true; @@ -224,8 +238,8 @@ public abstract class AbstractInitDataBase implements InitDataBase { private void createDbVersionTable(){ try{ Statement stmt = dbConn.createStatement(); - stmt.execute(createVersionTableSQL()); - stmt.execute(initDataVersionTableSQL()); + stmt.execute(baseVersionSQLUtil.builderCreateTableSQL()); + stmt.execute(baseVersionSQLUtil.builderInitDbVersionSQL()); stmt.close(); }catch (Exception e){ e.printStackTrace(); @@ -274,20 +288,20 @@ public abstract class AbstractInitDataBase implements InitDataBase { /** * 根据版本号获取数据库升级文件 * @param ver 库中版本号 - * @return List "version&filename" + * @return List "version&filename&desc" */ private List getFileList(Float ver){ List result = new ArrayList<>(); if(0 == ver){ for(int i = 0;i < dbConfigFile.size();i++){ JSONObject temp = dbConfigFile.getJSONObject(i); - result.add(temp.getStr("version")+"&"+temp.getStr("sqlfile")); + result.add(temp.getStr("version")+"&"+temp.getStr("sqlfile")+"&"+temp.getStr("desc")); } }else{ for(int index = 0;index < dbConfigFile.size();index++){ JSONObject temp = dbConfigFile.getJSONObject(index); if(Float.parseFloat(temp.getStr("version")) > ver){ - result.add(temp.getStr("version")+"&"+temp.getStr("sqlfile")); + result.add(temp.getStr("version")+"&"+temp.getStr("sqlfile")+"&"+temp.getStr("desc")); } } } @@ -315,16 +329,18 @@ public abstract class AbstractInitDataBase implements InitDataBase { * 预制建表语句 * @return String */ - private String createVersionTableSQL(){ - return "CREATE TABLE "+conscriptProperties.getTableName()+" (\n" + - " id INT PRIMARY KEY NOT NULL,\n" + - " version CHAR(10) NOT NULL,\n" + - " create_time CHAR(50) NOT NULL\n" + ");"; - } - - private String initDataVersionTableSQL(){ - return "INSERT INTO "+conscriptProperties.getTableName()+" VALUES (1,'0.1','2021-12-01 08:00:00');"; - } +// private String createVersionTableSQL(){ +// return "CREATE TABLE "+conscriptProperties.getTableName()+" (\n" + +// " version VARCHAR(10),\n" + +// " desc TEXT,\n" + +// " sql_name TEXT,\n" + +// " sql_size INT,\n" + +// " execute_time VARCHAR(50)\n" + ");"; +// } + +// private String initDataVersionTableSQL(){ +// return "INSERT INTO "+conscriptProperties.getTableName()+" VALUES ('0.0','init conscript','inner.sql',2,'1900-01-01 00:00:00');"; +// } diff --git a/src/main/java/com/gcc/airbase/conscript/action/InitDataBase.java b/src/main/java/com/gcc/airbase/conscript/action/InitDataBase.java index 10ddbd3bb1e8d6a4b20fe088559959f49f029d08..04c1f3f9440ef0404daf305cb79787cad2e76353 100644 --- a/src/main/java/com/gcc/airbase/conscript/action/InitDataBase.java +++ b/src/main/java/com/gcc/airbase/conscript/action/InitDataBase.java @@ -1,9 +1,7 @@ package com.gcc.airbase.conscript.action; import java.sql.Connection; -import java.sql.SQLDataException; import java.sql.SQLException; -import java.util.Map; /** * 初始化数据库机制 @@ -27,47 +25,14 @@ public interface InitDataBase { */ void startCoreJob() throws SQLException; - /** - * 测试数据库链接 - * @return boolean - */ - boolean testConnection(); + /** * 确认库是否存在 * @return boolean */ - boolean databaseIsExitd(Connection connection); + boolean databaseIsExist(Connection connection); - /** - * 创建数据库实例 - * @return Boolean - */ - boolean createDataBase(); - /** - * 获取当前数据库版本 - * @return - */ - Float getCurrenDbVersion(); - /** - * 执行sql内容 - * @param sqlcontent - * @return - * @throws SQLDataException - */ - boolean excuteSQL(Map sqlcontent) throws SQLException; - - /** - * 调整当前数据库版本号 - */ - void updateDbVersion(Object version) throws SQLException; - - - /** - * 关闭连接 - * @return - */ - void close() throws SQLException; } \ No newline at end of file diff --git a/src/main/java/com/gcc/airbase/conscript/action/dm/DaMengDataBase.java b/src/main/java/com/gcc/airbase/conscript/action/dm/DaMengDataBase.java index 50c83112a61c3732e2f9febb294be446e98ab827..302c661c76e42e734c3b4c5f3aa7c6489740ee78 100644 --- a/src/main/java/com/gcc/airbase/conscript/action/dm/DaMengDataBase.java +++ b/src/main/java/com/gcc/airbase/conscript/action/dm/DaMengDataBase.java @@ -41,7 +41,7 @@ public class DaMengDataBase extends AbstractInitDataBase { } @Override - public boolean databaseIsExitd(Connection connection) { + public boolean databaseIsExist(Connection connection) { try { Statement stmt = connection.createStatement(); ResultSet res = stmt.executeQuery("SELECT COUNT(DISTINCT object_name) AS NUM FROM ALL_OBJECTS WHERE object_type = 'SCH' AND object_name = '"+dataBaseProperties.getSchema()+"'"); @@ -56,9 +56,18 @@ public class DaMengDataBase extends AbstractInitDataBase { return false; } + @Override - public String createDataBaseSQL() { - return "CREATE SCHEMA \""+dataBaseProperties.getSchema()+"\" AUTHORIZATION \""+dataBaseProperties.getUsername()+"\" "; + public boolean createDataBase() { + try { + Statement stmt = commConn.createStatement(); + stmt.execute("CREATE SCHEMA \""+dataBaseProperties.getSchema()+"\" AUTHORIZATION \""+dataBaseProperties.getUsername()+"\" "); + stmt.close(); + }catch (Exception e){ + log.error("【Conscript】Create {} Database Failed !!",dataBaseProperties.getDbName()); + return false; + } + return true; } } diff --git a/src/main/java/com/gcc/airbase/conscript/action/kingbase8/KingBase8DataBase.java b/src/main/java/com/gcc/airbase/conscript/action/kingbase8/KingBase8DataBase.java index 326f28bad603e4cc72596462f1f276e5c7cadaac..f51c908aba5a010fd7b8dab4d838cd865c7c2b82 100644 --- a/src/main/java/com/gcc/airbase/conscript/action/kingbase8/KingBase8DataBase.java +++ b/src/main/java/com/gcc/airbase/conscript/action/kingbase8/KingBase8DataBase.java @@ -47,7 +47,7 @@ public class KingBase8DataBase extends AbstractInitDataBase { try { Statement stmt = commConn.createStatement(); stmt.execute("CREATE DATABASE "+dataBaseProperties.getDbName()+" OWNER "+dataBaseProperties.getUsername()+" encoding 'utf8' CONNECTION LIMIT 10"); - stmt.execute(this.createDataBaseSQL()); + stmt.execute("CREATE SCHEMA \""+dataBaseProperties.getSchema()+"\" AUTHORIZATION \""+dataBaseProperties.getUsername()+"\" "); stmt.close(); }catch (Exception e){ log.error("【Conscript】Create {} Database Fail!",dataBaseProperties.getDbName()); @@ -57,12 +57,7 @@ public class KingBase8DataBase extends AbstractInitDataBase { } @Override - public String createDataBaseSQL() { - return "CREATE SCHEMA \""+dataBaseProperties.getSchema()+"\" AUTHORIZATION \""+dataBaseProperties.getUsername()+"\" "; - } - - @Override - public boolean databaseIsExitd(Connection connection) { + public boolean databaseIsExist(Connection connection) { try { Statement stmt = connection.createStatement(); ResultSet res = stmt.executeQuery("SELECT DATNAME FROM sys_database WHERE DATNAME = '"+dataBaseProperties.getDbName()+"'"); diff --git a/src/main/java/com/gcc/airbase/conscript/action/mysql/MySqlDataBase.java b/src/main/java/com/gcc/airbase/conscript/action/mysql/MySqlDataBase.java index 9e845c05654d67c337d62a81870d8a132b99f34d..4c223e5e7baa88f03c4a8daee3dca184c3875c34 100644 --- a/src/main/java/com/gcc/airbase/conscript/action/mysql/MySqlDataBase.java +++ b/src/main/java/com/gcc/airbase/conscript/action/mysql/MySqlDataBase.java @@ -38,7 +38,7 @@ public class MySqlDataBase extends AbstractInitDataBase { } @Override - public boolean databaseIsExitd(Connection connection){ + public boolean databaseIsExist(Connection connection){ try { Statement stmt = connection.createStatement(); ResultSet res = stmt.executeQuery("SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name= \""+ dataBaseProperties.getDbName()+"\""); @@ -54,8 +54,16 @@ public class MySqlDataBase extends AbstractInitDataBase { } @Override - public String createDataBaseSQL() { - return "CREATE DATABASE IF NOT EXISTS "+ dataBaseProperties.getDbName()+" DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"; + public boolean createDataBase() { + try { + Statement stmt = commConn.createStatement(); + stmt.execute("CREATE DATABASE IF NOT EXISTS "+ dataBaseProperties.getDbName()+" DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); + stmt.close(); + }catch (Exception e){ + log.error("【Conscript】Create {} Database Failed !!",dataBaseProperties.getDbName()); + return false; + } + return true; } diff --git a/src/main/java/com/gcc/airbase/conscript/action/pgsql/PostgreSQLDataBase.java b/src/main/java/com/gcc/airbase/conscript/action/pgsql/PostgreSQLDataBase.java index 44aaa3cf6dbcf225318357f40499f7dbf470698e..f6f43dbab743877d2e68c4146c527a96b0ebd7c6 100644 --- a/src/main/java/com/gcc/airbase/conscript/action/pgsql/PostgreSQLDataBase.java +++ b/src/main/java/com/gcc/airbase/conscript/action/pgsql/PostgreSQLDataBase.java @@ -39,7 +39,7 @@ public class PostgreSQLDataBase extends AbstractInitDataBase { } @Override - public boolean databaseIsExitd(Connection connection) { + public boolean databaseIsExist(Connection connection) { try { Statement stmt = connection.createStatement(); ResultSet res = stmt.executeQuery("SELECT datname FROM pg_database WHERE datname =\'"+ dataBaseProperties.getDbName()+"\'"); @@ -55,8 +55,17 @@ public class PostgreSQLDataBase extends AbstractInitDataBase { } @Override - public String createDataBaseSQL() { - return "CREATE DATABASE "+ dataBaseProperties.getDbName()+" WITH OWNER = "+dataBaseProperties.getUsername()+" ENCODING = 'UTF-8' "; + public boolean createDataBase() { + try { + Statement stmt = commConn.createStatement(); + stmt.execute("CREATE DATABASE "+ dataBaseProperties.getDbName()+" WITH OWNER = "+dataBaseProperties.getUsername()+" ENCODING = 'UTF-8' "); + stmt.close(); + }catch (Exception e){ + log.error("【Conscript】Create {} Database Failed !!",dataBaseProperties.getDbName()); + return false; + } + return true; } + } diff --git a/src/main/java/com/gcc/airbase/conscript/model/BaseVersionSQL.java b/src/main/java/com/gcc/airbase/conscript/model/BaseVersionSQL.java new file mode 100644 index 0000000000000000000000000000000000000000..0555a134d3f6e3122ee62ed18e0928fa3ea2f9a3 --- /dev/null +++ b/src/main/java/com/gcc/airbase/conscript/model/BaseVersionSQL.java @@ -0,0 +1,67 @@ +package com.gcc.airbase.conscript.model; +import cn.hutool.core.date.DateUtil; + +/** + * 基础表信息SQL + */ +public class BaseVersionSQL { + + private String tableName; + + + public BaseVersionSQL(String tableName) { + this.tableName = tableName; + } + + /** + * 建表语句 + * @return String + */ + public String builderCreateTableSQL(){ + return "CREATE TABLE "+this.tableName+" (\n" + + " sql_version VARCHAR(10),\n" + + " sql_desc TEXT,\n" + + " sql_name TEXT,\n" + + " sql_size TEXT,\n" + + " execute_time VARCHAR(50)\n" + ");"; + } + + + public String builderSelectVersionSQL(){ + return "SELECT sql_version AS version FROM "+this.tableName+" ORDER BY execute_time DESC LIMIT 1;"; + } + + + /** + * 初始化SQL + * @return String + */ + public String builderInitDbVersionSQL(){ + return "INSERT INTO "+this.tableName+" VALUES ('0.0','init conscript','inner.sql','2','1900-01-01 00:00:00');"; + } + + + /** + * 生成插入SQL + * @param version 版本号 + * @param desc 描述 + * @param sqlName sql文件名称 + * @param sqlSize sql条数 + * @return String + */ + public String builderInsertDbVersionSQL(String version,String desc,String sqlName,Integer sqlSize){ + String executeTime = DateUtil.now(); + //todo 参数校验 + return "INSERT INTO "+this.tableName+" VALUES ('"+version+"','"+desc+"','"+ sqlName +"','"+sqlSize+"','"+executeTime+"');"; + } + + + + + + + + + + +}