6077c20c by 李墨

初始化提交

1 parent 37170fc2
Showing 25 changed files with 1541 additions and 1 deletions
DDL 脚本生成器
## DDL 脚本生成器
### 逻辑图
设计请看逻辑图.png
### 1. 使用步骤
1. 修改 DDLScriptCreatorTest 数据源。
2. 运行 DDLScriptCreatorTest main 方法。
3. 稍等一会就能在控制台看到 ddl 语句。
......
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.black</groupId>
<artifactId>ddl-script-creator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>
<packaging>jar</packaging>
<name>ddl-script-creator</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-core -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.5</version>
</dependency>
</dependencies>
</project>
package com.seektruth.ddl.creator;
import com.seektruth.ddl.creator.collector.DatabaseMetaDataCollector;
import com.seektruth.ddl.creator.ddl.Database;
import com.seektruth.ddl.creator.metadata.DatabaseMetaDataInfo;
import com.seektruth.ddl.creator.transfer.Transfer;
/**
* DDL 脚本生成器
* @author black
*
*/
public class DDLScriptCreator {
protected DatabaseMetaDataCollector collector;
protected Transfer transfer;
public DDLScriptCreator(DatabaseMetaDataCollector collector, Transfer transfer) {
this.collector = collector;
this.transfer = transfer;
}
protected String create() {
// 1.收集数据库元数据
DatabaseMetaDataInfo metaDataInfo = collector.collect();
// 2.将元数据转换为目标数据库信息
Database database = transfer.transform(metaDataInfo);
// 3.生成目标数据库的 ddl 脚本
return database.ddl();
}
}
package com.seektruth.ddl.creator.collector;
import com.seektruth.ddl.creator.datasource.Datasource;
import com.seektruth.ddl.creator.metadata.TableInfo;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.List;
/**
* MySQL 数据库元数据收集器
* @author black
*
*/
public class MySQLDatabaseMetaDataCollector extends DatabaseMetaDataCollector {
public MySQLDatabaseMetaDataCollector(Datasource datasource) throws ClassNotFoundException {
super(datasource);
}
@Override
protected List<TableInfo> getTables(DatabaseMetaData metaData) {
List<TableInfo> tablesInfos = null;
try {
tablesInfos = getTables(metaData, datasource.getDatabaseName(), null);
for (int i = 0; i < tablesInfos.size(); i++) {
TableInfo table =tablesInfos.get(i);
table.setColumns( getColumns(metaData, datasource.getDatabaseName(), table.getName()));
table.setPrimaryKey( getPrimaryKeys(metaData, table.getName()));
table.setIndexs( getIndexs(metaData, datasource.getDatabaseName(), table.getName()));
}
} catch (SQLException e) {
e.printStackTrace();
}
return tablesInfos;
}
}
package com.seektruth.ddl.creator.datasource;
/**
* 数据源信息
* @author black
*/
public class Datasource {
private String username;
private String password;
private String url;
private String driverClass;
private String databaseName;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDriverClass() {
return driverClass;
}
public void setDriverClass(String driverClass) {
this.driverClass = driverClass;
}
public String getDatabaseName() {
return databaseName;
}
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
}
package com.seektruth.ddl.creator.ddl;
public class Database {
public String ddl() {
return "";
}
}
package com.seektruth.ddl.creator.ddl.oracle;
import java.sql.JDBCType;
/**
* JDBC 类型与 Oracle 类型映射枚举
*
* @author black
*
*/
public enum JdbcTypeOracleTypeMapperEnum {
BIT(JDBCType.BIT,"number"),
SMALLINT(JDBCType.SMALLINT,"number"),
TINYINT(JDBCType.TINYINT, "number"),
INTEGER(JDBCType.INTEGER, "number"),
BIGINT(JDBCType.BIGINT , "number"),
DECIMAL(JDBCType.DECIMAL,"number"),
DOUBLE(JDBCType.DOUBLE,"number"),
LONGVARCHAR(JDBCType.LONGVARCHAR, "clob"),
TIMESTAMP(JDBCType.TIMESTAMP, "timestamp"),
VARCHAR(JDBCType.VARCHAR,"varchar2"),
;
JDBCType jdbcType;
String oracleType;
private JdbcTypeOracleTypeMapperEnum(JDBCType jdbcType, String oracleType) {
this.jdbcType = jdbcType;
this.oracleType = oracleType;
}
public JDBCType getJdbcType() {
return jdbcType;
}
public String getOracleType() {
return oracleType;
}
public static String getOracleType(JDBCType jdbcType) {
JdbcTypeOracleTypeMapperEnum e = get( jdbcType);
if(e == null ) {
return null;
}else {
return e.getOracleType();
}
}
public static JdbcTypeOracleTypeMapperEnum get(JDBCType jdbcType) {
JdbcTypeOracleTypeMapperEnum[] jdbcTypeOracleTypeMapperEnums = JdbcTypeOracleTypeMapperEnum.values();
for (int i = 0; i < jdbcTypeOracleTypeMapperEnums.length; i++) {
JdbcTypeOracleTypeMapperEnum e = jdbcTypeOracleTypeMapperEnums[i];
if (e.jdbcType == jdbcType) {
return e;
}
}
return null;
}
}
package com.seektruth.ddl.creator.ddl.oracle;
/**
* oracle 列信息
* @author black
*
*/
public class OracleColumn {
String tableName;
// 在表中的序号
Integer seq;
String name;
String typeName;
String length;
String scale;
String defaultValue;
String comment;
Boolean nullable;
// 需要使用单独序列
Boolean needSquence;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public Integer getSeq() {
return seq;
}
public void setSeq(Integer seq) {
this.seq = seq;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getLength() {
return length;
}
public void setLength(String length) {
this.length = length;
}
public String getScale() {
return scale;
}
public void setScale(String scale) {
this.scale = scale;
}
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Boolean getNullable() {
return nullable;
}
public void setNullable(Boolean nullable) {
this.nullable = nullable;
}
public Boolean getNeedSquence() {
return needSquence;
}
public void setNeedSquence(Boolean needSquence) {
this.needSquence = needSquence;
}
public OracleColumn() {
super();
}
public String sql() {
StringBuffer buffer = new StringBuffer();
buffer.append(" ").append(name).append(" ");
//System.out.println(tableName+", column :"+name+" typeName:" + typeName);
if(typeName.equals("number")) {
buffer.append(" ").append(typeName).append("(");
buffer.append(length);
if (scale != null) {
buffer.append(",").append(scale);
}
buffer.append(")").append(" ");
}else if(typeName.contains("varchar")) {
buffer.append(" ").append(typeName).append("(");
buffer.append(length);
buffer.append(")").append(" ");
}else if (typeName.equals("clob") || typeName.equals("timestamp")) {
buffer.append(" ").append(typeName).append(" ");
}
if (defaultValue != null) {
buffer.append("default ").append(defaultValue).append(" ");
}
if(!nullable) {
buffer.append("not null ");
}
return buffer.toString();
}
public String comment() {
StringBuffer buffer = new StringBuffer();
buffer.append(" comment on column ").append(tableName).append(".").append(name).append(" is ");
buffer.append("'").append(comment).append("';");
return buffer.toString();
}
}
package com.seektruth.ddl.creator.ddl.oracle;
import com.seektruth.ddl.creator.ddl.Database;
import java.util.ArrayList;
import java.util.List;
/**
* Oracle 数据库信息,可生成 oracle数据库的 DDL 脚本
* @author black
*
*/
public class OracleDatabase extends Database {
// 数据库名
String name;
// 表
List<OracleTable> tables = new ArrayList<OracleTable>();
// 序列
List<OracleSequence> sequences = new ArrayList<OracleSequence>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<OracleTable> getTables() {
return tables;
}
public void setTables(List<OracleTable> tables) {
this.tables = tables;
}
public List<OracleSequence> getSequences() {
return sequences;
}
public void setSequences(List<OracleSequence> sequences) {
this.sequences = sequences;
}
public String ddl() {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < tables.size(); i++) {
OracleTable table = tables.get(i);
buffer.append(table.ddl());
buffer.append(table.comment());
buffer.append("\n");
}
for (int i = 0; i < sequences.size(); i++) {
OracleSequence sequence = sequences.get(i);
buffer.append(sequence.ddl());
}
return buffer.toString();
}
}
package com.seektruth.ddl.creator.ddl.oracle;
import java.util.ArrayList;
import java.util.List;
/**
* oracle 索引信息
* @author black
*
*/
public class OracleIndex {
// 索引名
String name;
// 表名
String tableName;
// 唯一索引?
Boolean unique;
// 列
List<String> columns = new ArrayList<String>();
public String getName() {
return name;
}
public String getTableName() {
return tableName;
}
public List<String> getColumns() {
return columns;
}
public void setName(String name) {
this.name = name;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public void addColumn(String column) {
this.columns.add(column);
}
public Boolean getUnique() {
return unique;
}
public void setUnique(Boolean unique) {
this.unique = unique;
}
public String ddl() {
// create unique index {indexName} on {tableName}({column1},{column2})
StringBuffer buffer = new StringBuffer();
buffer.append("create ");
if(unique) {
buffer.append("unique ");
}
buffer.append("index ").append(name).append(" on ");
buffer.append(tableName).append(" (");
for (int i = 0; i < columns.size(); i++) {
String column = columns.get(i);
buffer.append(column);
if (i != (columns.size() - 1)) {
buffer.append(", ");
}
}
buffer.append(");\n");
return buffer.toString();
}
}
package com.seektruth.ddl.creator.ddl.oracle;
import java.util.List;
/**
* oracle主键信息
* @author black
*
*/
public class OraclePrimaryKey {
// 主键
String name;
// 表名
String tableName;
// 列
List<String> columns;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public List<String> getColumns() {
return columns;
}
public void setColumns(List<String> columns) {
this.columns = columns;
}
public String ddl() {
// alter table {table_a} add constraint {pkname} primary key ({column1},{column2}...);
StringBuffer buffer = new StringBuffer();
buffer.append("alter table ").append(tableName).append(" add constraint ");
buffer.append(name).append(" primary key (");
for (int i = 0; i < columns.size(); i++) {
String column = columns.get(i);
buffer.append(column);
if(i != (columns.size()-1) ) {
buffer.append(", ");
}
}
buffer.append(");\n");
return buffer.toString();
}
}
package com.seektruth.ddl.creator.ddl.oracle;
/**
* 序列信息
*
* @author black
*
*/
public class OracleSequence {
String name;
String start;
String increment;
String maxvalue;
String minvalue;
Boolean cycle;
Boolean cache;
Integer cacheSize;
public String getName() {
return name;
}
public String getStart() {
return start;
}
public String getIncrement() {
return increment;
}
public String getMaxvalue() {
return maxvalue;
}
public String getMinvalue() {
return minvalue;
}
public Boolean getCycle() {
return cycle;
}
public Boolean getCache() {
return cache;
}
public Integer getCacheSize() {
return cacheSize;
}
public void setName(String name) {
this.name = name;
}
public void setStart(String start) {
this.start = start;
}
public void setIncrement(String increment) {
this.increment = increment;
}
public void setMaxvalue(String maxvalue) {
this.maxvalue = maxvalue;
}
public void setMinvalue(String minvalue) {
this.minvalue = minvalue;
}
public void setCycle(Boolean cycle) {
this.cycle = cycle;
}
public void setCache(Boolean cache) {
this.cache = cache;
}
public void setCacheSize(Integer cacheSize) {
this.cacheSize = cacheSize;
}
public String ddl() {
// create sequence {name} start with {1} increment by {1} minvalue {1} maxvalue {9999999} nocycle nocache;
StringBuffer buffer = new StringBuffer();
buffer.append("create sequence ").append(name).append(" ");
buffer.append("start with ").append(start).append(" ");
buffer.append("increment by ").append(increment).append(" ");
buffer.append("minvalue ").append(minvalue).append(" ");
buffer.append("maxvalue ").append(maxvalue).append(" ");
if (cycle) {
buffer.append("cycle ");
} else {
buffer.append("nocycle ");
}
if (cache) {
buffer.append("cache ").append(cacheSize).append(" ");
} else {
buffer.append("nocache ");
}
buffer.append(";\n");
return buffer.toString();
}
}
package com.seektruth.ddl.creator.ddl.oracle;
import java.util.ArrayList;
import java.util.List;
/**
* oracle 表信息
* @author black
*
*/
public class OracleTable {
// 表名
String name;
// 主键
OraclePrimaryKey primaryKey;
// 列
List<OracleColumn> columns;
// 索引
List<OracleIndex> indexs = new ArrayList<OracleIndex>();
// 备注
String commnet;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public OraclePrimaryKey getPrimaryKey() {
return primaryKey;
}
public void setPrimaryKey(OraclePrimaryKey primaryKey) {
this.primaryKey = primaryKey;
}
public List<OracleColumn> getColumns() {
return columns;
}
public void setColumns(List<OracleColumn> columns) {
this.columns = columns;
}
public List<OracleIndex> getIndexs() {
return indexs;
}
public void setIndexs(List<OracleIndex> indexs) {
this.indexs = indexs;
}
public String getCommnet() {
return commnet;
}
public void setCommnet(String commnet) {
this.commnet = commnet;
}
public String ddl() {
// create table tablename( column1 columnType );
StringBuffer buffer = new StringBuffer();
buffer.append("create table ").append(name).append("(");
for (int i = 0; i < columns.size(); i++) {
OracleColumn oracleColumn = columns.get(i);
buffer.append("\n\t");
buffer.append(oracleColumn.sql());
if(i != columns.size() -1) {
buffer.append(",");
}
}
buffer.append(");\n");
// pk
if(primaryKey != null) {
buffer.append(primaryKey.ddl());
}
// 索引
for( int i = 0; i < indexs.size(); i++) {
OracleIndex index = indexs.get(i);
index.setName("idx_"+name+"_"+(i+1));
buffer.append(index.ddl());
}
return buffer.toString();
}
public String comment() {
StringBuffer buffer = new StringBuffer();
buffer.append(" comment on table ").append(name).append(" is ");
buffer.append("'").append(commnet).append("';");
for (int i = 0; i < columns.size(); i++) {
OracleColumn oracleColumn = columns.get(i);
buffer.append("\n");
buffer.append(oracleColumn.comment());
}
return buffer.toString();
}
}
package com.seektruth.ddl.creator.metadata;
/**
* 数据库元数据:表的列信息
* @author black
*
*/
public class ColumnInfo {
private String tableName;
private String name;
// java.sql.Types
private Integer type;
private String typeName;
private Integer size;
private Integer decimalDigits;
// 进制
private Integer radix;
private Integer nullable;
private String comment;
private String defaultValue;
// 序号
private Integer index;
private String is_nullable;
// 是否自增
private String autoincrement;
// 是否虚拟列
private String generatedcolumn;
// char 类型的最大字节数量
private Integer charTypeMaxBytesNumber;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public Integer getDecimalDigits() {
return decimalDigits;
}
public void setDecimalDigits(Integer decimalDigits) {
this.decimalDigits = decimalDigits;
}
public Integer getRadix() {
return radix;
}
public void setRadix(Integer radix) {
this.radix = radix;
}
public Integer getNullable() {
return nullable;
}
public void setNullable(Integer nullable) {
this.nullable = nullable;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
public Integer getIndex() {
return index;
}
public void setIndex(Integer index) {
this.index = index;
}
public String getIs_nullable() {
return is_nullable;
}
public void setIs_nullable(String is_nullable) {
this.is_nullable = is_nullable;
}
public String getAutoincrement() {
return autoincrement;
}
public void setAutoincrement(String autoincrement) {
this.autoincrement = autoincrement;
}
public String getGeneratedcolumn() {
return generatedcolumn;
}
public void setGeneratedcolumn(String generatedcolumn) {
this.generatedcolumn = generatedcolumn;
}
public Integer getCharTypeMaxBytesNumber() {
return charTypeMaxBytesNumber;
}
public void setCharTypeMaxBytesNumber(Integer charTypeMaxBytesNumber) {
this.charTypeMaxBytesNumber = charTypeMaxBytesNumber;
}
@Override
public String toString() {
return "ColumnInfo [tableName=" + tableName + ", name=" + name + ", type=" + type + ", typeName=" + typeName
+ ", size=" + size + ", decimalDigits=" + decimalDigits + ", radix=" + radix + ", nullable=" + nullable
+ ", comment=" + comment + ", defaultValue=" + defaultValue + ", index=" + index + ", is_nullable="
+ is_nullable + ", autoincrement=" + autoincrement + ", generatedcolumn=" + generatedcolumn
+ ", charTypeMaxBytesNumber=" + charTypeMaxBytesNumber + "]";
}
}
package com.seektruth.ddl.creator.metadata;
import java.util.List;
/**
* 数据库元数据
*
* @author black
*
*/
public class DatabaseMetaDataInfo {
private List<TableInfo> tables;
public List<TableInfo> getTables() {
return tables;
}
public void setTables(List<TableInfo> tables) {
this.tables = tables;
}
}
package com.seektruth.ddl.creator.metadata;
import java.util.Comparator;
/**
* 列下标比较器,用于索引中列排序
* @author black
*
*/
public class IndexColumnComparator implements Comparator<IndexColumnInfo> {
@Override
public int compare(IndexColumnInfo o1, IndexColumnInfo o2) {
if (o1.getSeq() == o2.getSeq()) {
return 0;
} else if (o1.getSeq() > o2.getSeq()) {
return 1;
} else {
return -1;
}
}
}
package com.seektruth.ddl.creator.metadata;
/**
* 数据库元数据:索引关联列信息
* @author black
*
*/
public class IndexColumnInfo {
// 索引中此列的位置
Short seq;
// 列名
String name;
// 排序
String ascOrDesc;
public Short getSeq() {
return seq;
}
public void setSeq(Short seq) {
this.seq = seq;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAscOrDesc() {
return ascOrDesc;
}
public void setAscOrDesc(String ascOrDesc) {
this.ascOrDesc = ascOrDesc;
}
@Override
public String toString() {
return "IndexColumnInfo [seq=" + seq + ", name=" + name + ", ascOrDesc=" + ascOrDesc + "]";
}
}
package com.seektruth.ddl.creator.metadata;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
/**
* 数据库元数据:索引信息
* @author black
*
*/
public class IndexInfo {
private String tableName;
private String name;
private Boolean nonUnique;
private List<IndexColumnInfo> columns = new ArrayList<IndexColumnInfo>();
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getNonUnique() {
return nonUnique;
}
public void setNonUnique(Boolean nonUnique) {
this.nonUnique = nonUnique;
}
public List<IndexColumnInfo> getColumns() {
return columns;
}
public void addColumn(Short seq, String name, String ascOrDesc) {
boolean hasThisColumn = columns.stream().anyMatch(new Predicate<IndexColumnInfo>() {
@Override
public boolean test(IndexColumnInfo t) {
if(t.getSeq() == seq) {
return true;
}
return false;
};
});
if(hasThisColumn) {
return ;
}
IndexColumnInfo columnInfo = new IndexColumnInfo();
columnInfo.setName(name);
columnInfo.setSeq(seq);
columnInfo.setAscOrDesc(ascOrDesc);
columns.add(columnInfo);
}
public void sortColumn() {
Collections.sort(columns, new IndexColumnComparator());
}
@Override
public String toString() {
return "IndexInfo [tableName=" + tableName + ", name=" + name + ", columns=" + columns + "]";
}
}
package com.seektruth.ddl.creator.metadata;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 数据库元数据:主键信息
* @author black
*
*/
public class PrimaryKeyInfo {
private String tableName;
private String name;
private List<IndexColumnInfo> columns = new ArrayList<IndexColumnInfo>();
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void addColumn(Short seq, String column) {
IndexColumnInfo indexColumnInfo= new IndexColumnInfo();
indexColumnInfo.setSeq(seq);
indexColumnInfo.setName(column);
columns.add(indexColumnInfo);
}
public void sortColumn() {
Collections.sort(columns, new IndexColumnComparator());
}
@Override
public String toString() {
return "PrimaryKeyInfo [tableName=" + tableName + ", name=" + name + ", columns=" + columns + "]";
}
public List<IndexColumnInfo> getColumns() {
return columns;
}
}
package com.seektruth.ddl.creator.metadata;
import java.util.List;
/**
* 数据库元数据:表信息
* @author black
*
*/
public class TableInfo {
private String catalog;
private String schema ;
// 表名
private String name ;
private String type ;
// 表注释
private String comment ;
private String typeCatalog;
private String typeSchema;
private String typeName ;
// 主键信息
private PrimaryKeyInfo primaryKey;
// 索引信息
private List<IndexInfo> indexs;
// 列信息
private List<ColumnInfo> columns;
public String getCatalog() {
return catalog;
}
public void setCatalog(String catalog) {
this.catalog = catalog;
}
public String getSchema() {
return schema;
}
public void setSchema(String schema) {
this.schema = schema;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getTypeCatalog() {
return typeCatalog;
}
public void setTypeCatalog(String typeCatalog) {
this.typeCatalog = typeCatalog;
}
public String getTypeSchema() {
return typeSchema;
}
public void setTypeSchema(String typeSchema) {
this.typeSchema = typeSchema;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public PrimaryKeyInfo getPrimaryKey() {
return primaryKey;
}
public List<IndexInfo> getIndexs() {
return indexs;
}
public void setPrimaryKey(PrimaryKeyInfo primaryKey) {
this.primaryKey = primaryKey;
}
public void setIndexs(List<IndexInfo> indexs) {
this.indexs = indexs;
}
public List<ColumnInfo> getColumns() {
return columns;
}
public void setColumns(List<ColumnInfo> columns) {
this.columns = columns;
}
@Override
public String toString() {
return "TableInfo [catalog=" + catalog + ", schema=" + schema + ", name=" + name + ", type=" + type
+ ", comment=" + comment + ", typeCatalog=" + typeCatalog + ", typeSchema=" + typeSchema + ", typeName="
+ typeName + "]";
}
}
package com.seektruth.ddl.creator.transfer;
import com.seektruth.ddl.creator.ddl.oracle.*;
import com.seektruth.ddl.creator.metadata.*;
import java.sql.JDBCType;
import java.util.ArrayList;
import java.util.List;
/**
* 将数据库元数据转换为 Oracle 数据库信息
* @author black
*
*/
public class OracleTransfer implements Transfer<OracleDatabase> {
@Override
public OracleDatabase transform(DatabaseMetaDataInfo metadata) {
OracleDatabase database = new OracleDatabase();
List<OracleTable> tables = database.getTables();
List<TableInfo> originTableInfos = metadata.getTables();
originTableInfos.forEach((tableInfo) -> {
OracleTable table = new OracleTable();
transformTable(tableInfo, table);
tables.add(table);
List<ColumnInfo> originColumnInfos = tableInfo.getColumns();
List<OracleColumn> columns = new ArrayList<OracleColumn>();
originColumnInfos.forEach((columnInfo) -> {
OracleColumn column = new OracleColumn();
transformColumn(columnInfo, column);
columns.add(column);
});
table.setColumns(columns);
// 主键索引
PrimaryKeyInfo orignTablePrimaryKey = tableInfo.getPrimaryKey();
if (orignTablePrimaryKey.getName() != null) {
OraclePrimaryKey key = new OraclePrimaryKey();
transformPk(orignTablePrimaryKey, key);
table.setPrimaryKey(key);
}
// 索引
List<IndexInfo> orignIndexInfos = tableInfo.getIndexs();
if (orignIndexInfos != null && orignIndexInfos.size() > 0) {
final List<OracleIndex> oracleIndexs = table.getIndexs();
orignIndexInfos.forEach((indexInfo) -> {
OracleIndex index = new OracleIndex();
transformIndex(indexInfo, index);
oracleIndexs.add(index);
});
}
// 生成序列 为自增列生成序列
List<OracleSequence> oracleSequences = database.getSequences();
OraclePrimaryKey tablePrimaryKey = table.getPrimaryKey();
for (int j = 0; j < columns.size(); j++) {
OracleColumn c = columns.get(j);
OracleSequence sequence = null;
// 判断是否主键列
boolean isPkColumn = false;
if (tablePrimaryKey != null && tablePrimaryKey.getColumns().get(0) != null) {
if (c.getName().equalsIgnoreCase(tablePrimaryKey.getColumns().get(0))) {
isPkColumn = true;
}
}
// 需要自增
if (c.getNeedSquence()) {
if (isPkColumn) {
// 主键列的序列命名:"表名_SEQ"
sequence = createSequence(c.getLength(), table.getName() + "_SEQ");
} else {
// 非主键列的序列命名:"表名_字段名_SEQ"
sequence = createSequence(c.getLength(),
table.getName() + "_" + columns.get(j).getName() + "_SEQ");
}
}
if(sequence != null) {
oracleSequences.add(sequence);
}
}
});
return database;
}
public void transformTable(TableInfo tableInfo, OracleTable table) {
table.setName(tableInfo.getName());
table.setCommnet(tableInfo.getComment());
}
public void transformColumn(ColumnInfo columnInfo, OracleColumn column) {
column.setComment(columnInfo.getComment());
column.setDefaultValue(columnInfo.getDefaultValue());
column.setLength(String.valueOf(columnInfo.getSize()));
column.setName(columnInfo.getName());
column.setScale(String.valueOf(columnInfo.getDecimalDigits()));
column.setSeq(columnInfo.getIndex());
column.setTableName(columnInfo.getTableName());
// 需要进行类型转换 JdbcTYpe 转 oracle type
JDBCType jdbcType = JDBCType.valueOf(columnInfo.getType());
column.setTypeName(JdbcTypeOracleTypeMapperEnum.getOracleType(jdbcType));
if (columnInfo.getNullable() != null) {
column.setNullable(columnInfo.getNullable() == 0 ? false : true);
}
if ("YES".equals(columnInfo.getAutoincrement())) {
// 自增需要序列
column.setNeedSquence(true);
} else {
column.setNeedSquence(false);
}
}
public void transformPk(PrimaryKeyInfo orignTablePrimaryKey,OraclePrimaryKey key) {
key.setName("pk_" + orignTablePrimaryKey.getTableName());
key.setTableName(orignTablePrimaryKey.getTableName());
List<IndexColumnInfo> orignTablePrimaryKeyColumns = orignTablePrimaryKey.getColumns();
List<String> columnsList = new ArrayList<>(orignTablePrimaryKeyColumns.size());
for (int j = 0; j < orignTablePrimaryKeyColumns.size(); j++) {
columnsList.add(orignTablePrimaryKeyColumns.get(j).getName());
}
key.setColumns(columnsList);
}
public void transformIndex(IndexInfo indexInfo ,OracleIndex index) {
index.setName(indexInfo.getName());
index.setTableName(indexInfo.getTableName());
index.setUnique(!indexInfo.getNonUnique());
List<IndexColumnInfo> orignTableIndexColumns = indexInfo.getColumns();
for (int j = 0; j < orignTableIndexColumns.size(); j++) {
IndexColumnInfo indexColumnInfo = orignTableIndexColumns.get(j);
index.addColumn(indexColumnInfo.getName() + " " + indexColumnInfo.getAscOrDesc());
}
}
// 创建序列
public OracleSequence createSequence(String columnLength, String name) {
OracleSequence sequence = new OracleSequence();
sequence.setCache(true);
sequence.setCacheSize(20);
sequence.setCycle(false);
sequence.setIncrement("1");
sequence.setMinvalue("1");
sequence.setMaxvalue(sequenceMaxValue(columnLength));
sequence.setName(name);
sequence.setStart("1");
return sequence;
}
private String sequenceMaxValue(String length) {
String maxValue = "";
Integer lengthInteger = Integer.parseInt(length);
for (int i = 0; i < lengthInteger; i++) {
maxValue = maxValue + "9";
}
return maxValue;
}
}
package com.seektruth.ddl.creator.transfer;
import com.seektruth.ddl.creator.ddl.Database;
import com.seektruth.ddl.creator.metadata.DatabaseMetaDataInfo;
/**
* 转换器
* @author black
*
*/
public interface Transfer<T extends Database> {
T transform(DatabaseMetaDataInfo metadata);
}
package com.seektruth.ddl.creator;
import com.seektruth.ddl.creator.collector.DatabaseMetaDataCollector;
import com.seektruth.ddl.creator.collector.MySQLDatabaseMetaDataCollector;
import com.seektruth.ddl.creator.datasource.Datasource;
import com.seektruth.ddl.creator.transfer.OracleTransfer;
import com.seektruth.ddl.creator.transfer.Transfer;
public class DDLScriptCreatorTest {
public static void main(String[] args) throws ClassNotFoundException {
Datasource datasource = mysql();
DatabaseMetaDataCollector collector = new MySQLDatabaseMetaDataCollector(datasource);
Transfer transfer = new OracleTransfer();
DDLScriptCreator creater = new DDLScriptCreator(collector, transfer);
System.out.println(creater.create());
}
public static Datasource oracle() {
String devUrl="jdbc:oracle:thin:@localhost:1521:orcl?useInformationSchema=true";
String userName="dev_poc_rec";
String password="black";
Datasource datasource = new Datasource();
datasource.setDriverClass("oracle.jdbc.driver.OracleDriver");
datasource.setUrl(devUrl);
datasource.setUsername(userName);
datasource.setPassword(password);
datasource.setDatabaseName("orcl");
return datasource;
}
public static Datasource mysql() {
//pedantic=true&
String devUrl="jdbc:mysql://rm-2zen60zh797n662w4lo.mysql.rds.aliyuncs.com:3306/dev_poc_rec?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useInformationSchema=true&nullDatabaseMeansCurrent=true";
String userName="dev_poc_rec";
String password="HMTWBekcV116aZfoy18Au4";
// String devUrl="jdbc:mysql://rm-2zen60zh797n662w4lo.mysql.rds.aliyuncs.com:3306/standard_bank_test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useInformationSchema=true&nullDatabaseMeansCurrent=true";
// String userName="standard_bank_ts";
// String password="cnX%Dio16YIKEWvt&UOdH";
// String devUrl="jdbc:mysql://rm-2zen60zh797n662w4lo.mysql.rds.aliyuncs.com:3306/poc-rec-bank?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useInformationSchema=true&nullDatabaseMeansCurrent=true";
// String userName="poc_rec_bank";
// String password="f$FwIdm16Lp192qt014UT6o";
Datasource datasource = new Datasource();
datasource.setDriverClass("com.mysql.cj.jdbc.Driver");
datasource.setUrl(devUrl);
datasource.setUsername(userName);
datasource.setPassword(password);
datasource.setDatabaseName("dev_poc_rec");
return datasource;
}
}
逻辑图.png

15.4 KB

Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!