Browse Source

update

main
wangshaoping 12 months ago
parent
commit
507f730eb9
  1. 85
      io.sc.platform.core/src/main/java/io/sc/platform/core/util/ClassUtil.java
  2. 18
      io.sc.platform.core/src/main/java/io/sc/platform/core/util/TypeConvertor.java
  3. 4
      io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/exporter/LiquibaseDataCsvExporter.java
  4. 134
      io.sc.platform.jdbc.liquibase/src/main/java/io/sc/platform/jdbc/liquibase/task/CsvImportTaskChange.java

85
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;
}
}

18
io.sc.platform.core/src/main/java/io/sc/platform/core/util/TypeConvertor.java

@ -1,6 +1,7 @@
package io.sc.platform.core.util; package io.sc.platform.core.util;
import org.springframework.core.convert.support.DefaultConversionService; 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 { public class TypeConvertor {
private TypeConvertor(){} private TypeConvertor(){}
/**
* 将字符串转换成所需类型值
* @param string 字符串
* @param targetType 目标类型
* @return 转换后的值
* @param <T> 泛型
*/
public static <T> T getValue(String string, Class<T> targetType){
if(StringUtils.hasText(string)) {
return DefaultConversionService.getSharedInstance().convert(string, targetType);
}
return null;
}
/** /**
* 将字符串转换成所需类型值 * 将字符串转换成所需类型值
* @param string 字符串 * @param string 字符串
@ -18,7 +34,7 @@ public class TypeConvertor {
* @param <T> 泛型 * @param <T> 泛型
*/ */
public static <T> T getValue(String string, Class<T> targetType, T defaultValue){ public static <T> T getValue(String string, Class<T> targetType, T defaultValue){
T value =DefaultConversionService.getSharedInstance().convert(string,targetType); T value =getValue(string,targetType);
return (value != null ? value : defaultValue); return (value != null ? value : defaultValue);
} }
} }

4
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.Column;
import io.sc.platform.jdbc.meta.support.Table; import io.sc.platform.jdbc.meta.support.Table;
import io.sc.platform.jdbc.util.SqlTypeUtil; import io.sc.platform.jdbc.util.SqlTypeUtil;
import liquibase.repackaged.com.opencsv.CSVWriter;
import liquibase.repackaged.com.opencsv.CSVWriterBuilder; import liquibase.repackaged.com.opencsv.CSVWriterBuilder;
import liquibase.repackaged.com.opencsv.ICSVWriter; import liquibase.repackaged.com.opencsv.ICSVWriter;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -41,12 +42,13 @@ public class LiquibaseDataCsvExporter implements DataExporter {
progressInfo.setMessageKey(table.getName()); progressInfo.setMessageKey(table.getName());
new File(OUTPUT_PATH + "/" + configure.getSchema()).mkdirs(); new File(OUTPUT_PATH + "/" + configure.getSchema()).mkdirs();
BufferedWriter writer = WriterUtil.bufferedWriter(OUTPUT_PATH + "/" + configure.getSchema() + "/" + table.getName() + ".csv"); 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(); ICSVWriter csvWriter = new CSVWriterBuilder(writer).build();
writeTable(dataSource,table,csvWriter,configure,progressInfo,locale); writeTable(dataSource,table,csvWriter,configure,progressInfo,locale);
csvWriter.flush(); csvWriter.flush();
csvWriter.close(); csvWriter.close();
progressInfo.addWeight(1); progressInfo.addWeight(1);
Thread.sleep(5000); Thread.sleep(1000);
} }
} }

134
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; 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.change.custom.CustomTaskChange;
import liquibase.database.Database; import liquibase.database.Database;
import liquibase.database.DatabaseConnection;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.CustomChangeException; import liquibase.exception.CustomChangeException;
import liquibase.exception.SetupException; import liquibase.exception.SetupException;
import liquibase.exception.ValidationErrors; import liquibase.exception.ValidationErrors;
import liquibase.repackaged.com.opencsv.CSVReader;
import liquibase.repackaged.com.opencsv.CSVReaderBuilder;
import liquibase.resource.ResourceAccessor; 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 { public class CsvImportTaskChange implements CustomTaskChange {
private String dataFileLocation; private static final Logger log = LoggerFactory.getLogger(CsvImportTaskChange.class);
private String cfgFileLocation; private String table;
private String dataFile;
public String getDataFileLocation() { public String getTable() {
return dataFileLocation; return table;
} }
public void setDataFileLocation(String dataFileLocation) { public void setTable(String table) {
this.dataFileLocation = dataFileLocation; this.table = table;
} }
public String getCfgFileLocation() { public String getDataFile() {
return cfgFileLocation; return dataFile;
} }
public void setCfgFileLocation(String cfgFileLocation) { public void setDataFile(String dataFile) {
this.cfgFileLocation = cfgFileLocation; this.dataFile = dataFile;
} }
@Override @Override
public void execute(Database database) throws CustomChangeException { 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 @Override
@ -51,4 +84,83 @@ public class CsvImportTaskChange implements CustomTaskChange {
public ValidationErrors validate(Database database) { public ValidationErrors validate(Database database) {
return null; 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<String[]> 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<columns.length;i++) {
ps.setObject(i+1, TypeConvertor.getValue(data[i],columns[i].getJavaType(),null));
}
ps.addBatch();
if((index++)%1000==0){
ps.executeBatch();
}
}
ps.executeBatch();
ps.close();
}
reader.close();
}
private Column[] buildColumns(Iterator<String[]> 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;i<names.length;i++){
Column column =new Column();
column.setName(names[i]);
column.setRemarks(remarks[i]);
column.setSqlType(sqlTypes[i]);
column.setJavaType(ClassUtil.of(javaTypes[i]));
columns[i] =column;
}
return columns;
}
private String getSql(Column[] columns){
if(columns!=null && columns.length>0){
StringBuilder sb =new StringBuilder();
sb.append("insert into ").append(table).append("(");
Collection<String> 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);
}
} }

Loading…
Cancel
Save