浏览代码

自动生成sql工具类

yuzijian 2 年之前
父节点
当前提交
b200b041f4

+ 6 - 1
pom.xml

@@ -78,7 +78,12 @@
             <artifactId>spring-boot-autoconfigure</artifactId>
             <version>2.7.2</version>
         </dependency>
-
+        <!--生成sql脚本工具-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.5</version>
+        </dependency>
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>

+ 10 - 3
src/main/java/com/syjy/calculate/config/StarterAutoConfigure.java

@@ -3,6 +3,7 @@ package com.syjy.calculate.config;
 import com.syjy.calculate.listener.ApplicationListenerImpl;
 import com.syjy.calculate.repository.repositoryImpl.CalculationFormulaRepositoryImpl;
 import com.syjy.calculate.service.AccuracyPassRateCalculateService;
+import com.syjy.calculate.util.CreateAndInsertSqlUtil;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
@@ -14,23 +15,29 @@ public class StarterAutoConfigure {
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = "calculate.service", value = "enabled", havingValue = "true")
-    AccuracyPassRateCalculateService accuracyPassRateCalculateService (){
+    AccuracyPassRateCalculateService accuracyPassRateCalculateService() {
         return new AccuracyPassRateCalculateService();
     }
 
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = "calculate.service", value = "enabled", havingValue = "true")
-    CalculationFormulaRepositoryImpl calculationFormulaRepositoryImpl (){
+    CalculationFormulaRepositoryImpl calculationFormulaRepositoryImpl() {
         return new CalculationFormulaRepositoryImpl();
     }
 
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = "calculate.service", value = "enabled", havingValue = "true")
-    ApplicationListenerImpl applicationListenerImpl (){
+    ApplicationListenerImpl applicationListenerImpl() {
         return new ApplicationListenerImpl();
     }
 
+    @Bean
+    @ConditionalOnMissingBean
+    @ConditionalOnProperty(prefix = "calculate.service", value = "enabled", havingValue = "true")
+    CreateAndInsertSqlUtil CreateAndInsertSqlUtil() {
+        return new CreateAndInsertSqlUtil();
+    }
 
 }

+ 134 - 0
src/main/java/com/syjy/calculate/util/CreateAndInsertSqlUtil.java

@@ -0,0 +1,134 @@
+package com.syjy.calculate.util;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.file.FileWriter;
+import cn.hutool.core.text.StrBuilder;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.Db;
+import cn.hutool.db.DbUtil;
+import cn.hutool.db.Entity;
+import cn.hutool.db.ds.DSFactory;
+import lombok.Data;
+import lombok.SneakyThrows;
+import lombok.experimental.Accessors;
+
+import java.io.File;
+import java.util.List;
+
+
+public class CreateAndInsertSqlUtil {
+    private static final String FILE_NAME = "../../../sql/t_calculation_formula.sql";
+
+    /**
+     * 需要生成的表
+     */
+    private static final List<TempBean> CONFIG_LIST = CollectionUtil.newArrayList(
+            new TempBean().setTable("t_calculation_formula"),
+            new TempBean().setTable("t_calculation_formula").setCreate(false)
+    );
+
+    /**
+     * 不需要生成的字段:如虚拟列
+     */
+    private static final List<String> filedIgnoreList = CollectionUtil.newArrayList(
+            "",
+            "",
+            ""
+    );
+
+/*    public static void main(String[] args) {
+        CreateAndInsertSqlUtil.start("test-db-dev", "ipfcst-v3");
+    }*/
+
+    /**
+     * 生成 sql
+     *
+     * @param dbSetting 配置名 如配置:[test-db-dev],这里传 test-db-dev
+     * @param dbName    数据库名
+     */
+    @SneakyThrows
+    public void start(String dbSetting, String dbName) {
+        Db db = DbUtil.use(DSFactory.get(dbSetting));
+
+        FileWriter sqlFileWriter = FileWriter.create(new File(FILE_NAME));
+        sqlFileWriter.write("");
+        sqlFileWriter.append("USE " + dbName + ";\n");
+        sqlFileWriter.append("SET NAMES utf8mb4;\n");
+        sqlFileWriter.append("SET FOREIGN_KEY_CHECKS = 0;\n");
+        for (TempBean tempBean : CONFIG_LIST) {
+            String table = tempBean.table;
+            sqlFileWriter.append("\n\n\n");
+            if (tempBean.create) {
+                // DROP TABLE
+                sqlFileWriter.append("DROP TABLE IF EXISTS `" + table + "`;\n");
+                // CREATE TABLE
+                Entity createTableEntity = db.queryOne("SHOW CREATE TABLE " + table);
+                sqlFileWriter.append((String) createTableEntity.get("Create Table"));
+                sqlFileWriter.append(";\n");
+            }
+            // 看配置,是否需要insert语句
+            if (tempBean.insert) {
+                // INSERT INTO
+                List<Entity> dataEntityList = db.query("SELECT * FROM " + table);
+                for (Entity dataEntity : dataEntityList) {
+                    StrBuilder field = StrBuilder.create();
+                    StrBuilder data = StrBuilder.create();
+
+                    dataEntity.forEach((key, valueObj) -> {
+                        String valueStr = StrUtil.toString(valueObj);
+                        // 看配置,某些列不需要
+                        if (filedIgnoreList.contains(key)) {
+                            return;
+                        }
+                        field.append("`").append(key).append("`").append(", ");
+                        if (ObjectUtil.isNotNull(valueStr)) {
+                            // 值包含 ' 转义处理
+                            valueStr = StrUtil.replace(valueStr, "'", "\\'");
+                            // boolean 值处理
+                            if (StrUtil.equals("true", valueStr)) {
+                                data.append("b'1'");
+                            } else if (StrUtil.equals("false", valueStr)) {
+                                data.append("b'0'");
+                            } else {
+                                data.append("'").append(valueStr).append("'");
+                            }
+                        } else {
+                            data.append("NULL");
+                        }
+                        data.append(", ");
+                    });
+
+                    sqlFileWriter.append("INSERT INTO `" + table + "`(");
+                    String fieldStr = field.subString(0, field.length() - 2);
+                    sqlFileWriter.append(fieldStr);
+                    sqlFileWriter.append(") VALUES (");
+                    String dataStr = data.subString(0, data.length() - 2);
+                    sqlFileWriter.append(dataStr);
+                    sqlFileWriter.append(");\n");
+                }
+            }
+        }
+        sqlFileWriter.append("\n\n\n");
+        sqlFileWriter.append("SET FOREIGN_KEY_CHECKS = 1;\n");
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    static class TempBean {
+        /**
+         * 表名
+         */
+        public String table;
+        /**
+         * 是否需要 create 建表语句,默认需要
+         */
+        public Boolean create = true;
+        /**
+         * 是否需要 insert 语句,默认需要
+         */
+        public Boolean insert = true;
+    }
+
+}

+ 12 - 0
src/main/resources/config/db.setting

@@ -0,0 +1,12 @@
+## 数据库连接信息
+[test-db-dev]
+#------------------------------------------------------------------------------------------
+## 基本配置信息
+# JDBC URL,根据不同的数据库,使用相应的JDBC连接字符串
+url = jdbc:mysql://localhost:3306/ipfcst-v3?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+# 用户名,此处也可以使用 user 代替
+username = root
+# 密码,此处也可以使用 pass 代替
+password = root
+# JDBC驱动名,可选(Hutool会自动识别)
+driver = com.mysql.cj.jdbc.Driver

+ 1 - 0
src/main/resources/sql/t_calculation_formula.sql

@@ -59,3 +59,4 @@ INSERT INTO `t_calculation_formula` VALUES (18, 'PASS', 1, 'sum:(1-math.abs((sj-
 INSERT INTO `t_calculation_formula` VALUES (19, 'PASS', 2, 'result1/count', 'E14;E15;E21;E22;E23;E23Old;E61;', NULL, NULL, NULL, NULL, NULL);
 
 SET FOREIGN_KEY_CHECKS = 1;
+