From 507f730eb9da024f70c0aca5c187e62d9d222014 Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Thu, 7 Mar 2024 18:01:43 +0800 Subject: [PATCH] update --- .../io/sc/platform/core/util/ClassUtil.java | 85 +++++++++++ .../sc/platform/core/util/TypeConvertor.java | 18 ++- .../exporter/LiquibaseDataCsvExporter.java | 4 +- .../liquibase/task/CsvImportTaskChange.java | 134 ++++++++++++++++-- 4 files changed, 228 insertions(+), 13 deletions(-) create mode 100644 io.sc.platform.core/src/main/java/io/sc/platform/core/util/ClassUtil.java diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/ClassUtil.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/ClassUtil.java new file mode 100644 index 00000000..393c7cac --- /dev/null +++ b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/ClassUtil.java @@ -0,0 +1,85 @@ +package io.sc.platform.core.util; + +import org.springframework.util.StringUtils; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Timestamp; +import java.util.Date; + +public class ClassUtil { + public static Class of(String className){ + if(StringUtils.hasText(className)){ + if(byte.class.getName().equals(className)){ //byte + return byte.class; + }else if(byte[].class.getName().equals(className)){ //byte[] + return byte[].class; + }else if(Byte.class.getName().equals(className)){ //Byte + return Byte.class; + }else if(Byte[].class.getName().equals(className)){ //Byte[] + return Byte[].class; + }else if(short.class.getName().equals(className)){ //short + return short.class; + }else if(short[].class.getName().equals(className)){ //short[] + return short[].class; + }else if(Short.class.getName().equals(className)){ //Short + return Short.class; + }else if(Short[].class.getName().equals(className)){ //Short[] + return Short[].class; + }else if(int.class.getName().equals(className)){ //int + return int.class; + }else if(int[].class.getName().equals(className)){ //int[] + return int[].class; + }else if(Integer.class.getName().equals(className)){ //Integer + return Integer.class; + }else if(Integer[].class.getName().equals(className)){ //Integer[] + return Integer[].class; + }else if(long.class.getName().equals(className)){ //long + return long.class; + }else if(long[].class.getName().equals(className)){ //long[] + return long[].class; + }else if(Long.class.getName().equals(className)){ //Long + return Long.class; + }else if(Long[].class.getName().equals(className)){ //Long[] + return Long[].class; + }else if(float.class.getName().equals(className)){ //float + return float.class; + }else if(float[].class.getName().equals(className)){ //float[] + return float[].class; + }else if(Float.class.getName().equals(className)){ //Float + return Float.class; + }else if(Float[].class.getName().equals(className)){ //Float[] + return Float[].class; + }else if(double.class.getName().equals(className)){ //double + return double.class; + }else if(double[].class.getName().equals(className)){ //double[] + return double[].class; + }else if(Double.class.getName().equals(className)){ //Double + return Double.class; + }else if(Double[].class.getName().equals(className)){ //Double[] + return Double[].class; + }else if(BigInteger.class.getName().equals(className)){ //BigInteger + return BigInteger.class; + }else if(BigInteger[].class.getName().equals(className)){ //BigInteger[] + return BigInteger[].class; + }else if(BigDecimal.class.getName().equals(className)){ //BigDecimal + return BigDecimal.class; + }else if(BigDecimal[].class.getName().equals(className)){ //BigDecimal[] + return BigDecimal[].class; + }else if(String.class.getName().equals(className)){ //String + return String.class; + }else if(String[].class.getName().equals(className)){ //String + return String[].class; + }else if(Date.class.getName().equals(className)){ //Date + return Date.class; + }else if(Date[].class.getName().equals(className)){ //Date + return Date[].class; + }else if(Timestamp.class.getName().equals(className)){ // Timestamp + return Timestamp.class; + }else{ + throw new RuntimeException("can NOT transform " + className + " to Class"); + } + } + return null; + } +} diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/TypeConvertor.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/TypeConvertor.java index 0387fca1..3df089e4 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/TypeConvertor.java +++ b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/TypeConvertor.java @@ -1,6 +1,7 @@ package io.sc.platform.core.util; import org.springframework.core.convert.support.DefaultConversionService; +import org.springframework.util.StringUtils; /** * 类型转换器 @@ -9,6 +10,21 @@ import org.springframework.core.convert.support.DefaultConversionService; */ public class TypeConvertor { private TypeConvertor(){} + + /** + * 将字符串转换成所需类型值 + * @param string 字符串 + * @param targetType 目标类型 + * @return 转换后的值 + * @param 泛型 + */ + public static T getValue(String string, Class targetType){ + if(StringUtils.hasText(string)) { + return DefaultConversionService.getSharedInstance().convert(string, targetType); + } + return null; + } + /** * 将字符串转换成所需类型值 * @param string 字符串 @@ -18,7 +34,7 @@ public class TypeConvertor { * @param 泛型 */ public static T getValue(String string, Class targetType, T defaultValue){ - T value =DefaultConversionService.getSharedInstance().convert(string,targetType); + T value =getValue(string,targetType); return (value != null ? value : defaultValue); } } diff --git a/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseDataCsvExporter.java b/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseDataCsvExporter.java index 592b60e2..08a18699 100644 --- a/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseDataCsvExporter.java +++ b/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseDataCsvExporter.java @@ -11,6 +11,7 @@ import io.sc.platform.jdbc.meta.MetaDataLoader; import io.sc.platform.jdbc.meta.support.Column; import io.sc.platform.jdbc.meta.support.Table; import io.sc.platform.jdbc.util.SqlTypeUtil; +import liquibase.repackaged.com.opencsv.CSVWriter; import liquibase.repackaged.com.opencsv.CSVWriterBuilder; import liquibase.repackaged.com.opencsv.ICSVWriter; import org.slf4j.Logger; @@ -41,12 +42,13 @@ public class LiquibaseDataCsvExporter implements DataExporter { progressInfo.setMessageKey(table.getName()); new File(OUTPUT_PATH + "/" + configure.getSchema()).mkdirs(); BufferedWriter writer = WriterUtil.bufferedWriter(OUTPUT_PATH + "/" + configure.getSchema() + "/" + table.getName() + ".csv"); + //ICSVWriter csvWriter = new CSVWriterBuilder(writer).withQuoteChar(CSVWriter.NO_QUOTE_CHARACTER).build(); ICSVWriter csvWriter = new CSVWriterBuilder(writer).build(); writeTable(dataSource,table,csvWriter,configure,progressInfo,locale); csvWriter.flush(); csvWriter.close(); progressInfo.addWeight(1); - Thread.sleep(5000); + Thread.sleep(1000); } } diff --git a/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/task/CsvImportTaskChange.java b/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/task/CsvImportTaskChange.java index ceb7eed5..f62090a5 100644 --- a/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/task/CsvImportTaskChange.java +++ b/io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/task/CsvImportTaskChange.java @@ -1,35 +1,68 @@ package io.sc.platform.jdbc.liquibase.task; +import io.sc.platform.core.Environment; +import io.sc.platform.core.util.ClassUtil; +import io.sc.platform.core.util.StringUtil; +import io.sc.platform.core.util.TypeConvertor; +import io.sc.platform.jdbc.meta.support.Column; import liquibase.change.custom.CustomTaskChange; import liquibase.database.Database; +import liquibase.database.DatabaseConnection; +import liquibase.database.jvm.JdbcConnection; import liquibase.exception.CustomChangeException; import liquibase.exception.SetupException; import liquibase.exception.ValidationErrors; +import liquibase.repackaged.com.opencsv.CSVReader; +import liquibase.repackaged.com.opencsv.CSVReaderBuilder; import liquibase.resource.ResourceAccessor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.stream.Collectors; public class CsvImportTaskChange implements CustomTaskChange { - private String dataFileLocation; - private String cfgFileLocation; + private static final Logger log = LoggerFactory.getLogger(CsvImportTaskChange.class); + private String table; + private String dataFile; - public String getDataFileLocation() { - return dataFileLocation; + public String getTable() { + return table; } - public void setDataFileLocation(String dataFileLocation) { - this.dataFileLocation = dataFileLocation; + public void setTable(String table) { + this.table = table; } - public String getCfgFileLocation() { - return cfgFileLocation; + public String getDataFile() { + return dataFile; } - public void setCfgFileLocation(String cfgFileLocation) { - this.cfgFileLocation = cfgFileLocation; + public void setDataFile(String dataFile) { + this.dataFile = dataFile; } @Override public void execute(Database database) throws CustomChangeException { - + DatabaseConnection connection =database.getConnection(); + if(connection instanceof JdbcConnection){ + JdbcConnection conn =(JdbcConnection)connection; + try { + execute(conn); + } catch (Exception e) { + log.error("",e); + throw new CustomChangeException(e); + } + } } @Override @@ -51,4 +84,83 @@ public class CsvImportTaskChange implements CustomTaskChange { public ValidationErrors validate(Database database) { return null; } + + public void execute(JdbcConnection connection) throws Exception { + Resource resource =new DefaultResourceLoader().getResource(dataFile); + if(resource==null || !resource.exists()){ + throw new RuntimeException(dataFile + " NOT found"); + } + + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream(), Environment.DEFAULT_CHARSET_NAME)); + CSVReader reader = new CSVReaderBuilder(bufferedReader).build(); + Iterator iterator = reader.iterator(); + + if(iterator.hasNext()) { + Column[] columns = buildColumns(iterator); + PreparedStatement ps =connection.prepareStatement(getSql(columns)); + long index =0; + while(iterator.hasNext()){ + String[] data =iterator.next(); + for(int i=0;i iterator){ + // 第一行: 字段名 + String[] names =iterator.next(); + // 第二行: 备注 + String[] remarks =iterator.next(); + // 第三行: sql 类型 + String[] sqlTypes =iterator.next(); + // 第四行: java 类型 + String[] javaTypes =iterator.next(); + + Column[] columns =new Column[names.length]; + for(int i=0;i0){ + StringBuilder sb =new StringBuilder(); + sb.append("insert into ").append(table).append("("); + Collection names =Arrays.stream(columns).map(Column::getName).collect(Collectors.toList()); + sb.append(StringUtil.combine(",",names)); + sb.append(") values ("); + sb.append(StringUtil.combine(",","?",columns.length)); + sb.append(")"); + return sb.toString(); + } + return null; + } + + public static void main(String[] args) throws Exception { + String url ="jdbc:p6spy:mysql://localhost:3306/platform?autoReconnect=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"; + String username ="platform"; + String password ="platform"; + Connection connection = DriverManager.getConnection(url,username,password); + JdbcConnection jdbcConnection =new JdbcConnection(connection); + + CsvImportTaskChange change =new CsvImportTaskChange(); + change.setTable("SYS_MENU"); + change.setDataFile("file:/Users/wangshaoping/wspsc/workspace/wangshaoping/v8/platform/app.platform/work/web/export/platform/sys_menu.csv"); + change.execute(jdbcConnection); + } }