sqlserver->mysql建表语句转换
升级druid版本到最新1.2.14 处理冗余代码
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -143,7 +143,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid</artifactId>
|
<artifactId>druid</artifactId>
|
||||||
<version>1.2.8</version>
|
<version>1.2.14</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.freemarker</groupId>
|
<groupId>org.freemarker</groupId>
|
||||||
|
|||||||
@@ -26,6 +26,56 @@
|
|||||||
select #{tableName} as name
|
select #{tableName} as name
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="getTableDdl" resultType="java.util.Map">
|
||||||
|
select 'create table [' + so.name + '] (' + o.list + ')' + CASE
|
||||||
|
WHEN tc.Constraint_Name IS NULL THEN ''
|
||||||
|
ELSE 'ALTER TABLE ' + so.Name +
|
||||||
|
' ADD CONSTRAINT ' + tc.Constraint_Name +
|
||||||
|
' PRIMARY KEY ' +
|
||||||
|
' (' + LEFT(j.List, Len(j.List)-1) + ')' END
|
||||||
|
from sysobjects so
|
||||||
|
cross apply
|
||||||
|
(SELECT
|
||||||
|
' ['+ column_name +'] ' +
|
||||||
|
data_type + case data_type
|
||||||
|
when 'sql_variant' then ''
|
||||||
|
when 'text' then ''
|
||||||
|
when 'ntext' then ''
|
||||||
|
when 'xml' then ''
|
||||||
|
when 'image' then ''
|
||||||
|
when 'decimal' then '(' + cast (numeric_precision as varchar) + ', ' + cast (numeric_scale as varchar) + ')'
|
||||||
|
else coalesce ('('+ case when character_maximum_length = -1 then 'MAX' else cast (character_maximum_length as varchar) end +')', '') end + ' ' +
|
||||||
|
case when exists (
|
||||||
|
select id from syscolumns
|
||||||
|
where object_name(id)=so.name
|
||||||
|
and name = column_name
|
||||||
|
and columnproperty(id, name, 'IsIdentity') = 1
|
||||||
|
) then
|
||||||
|
'IDENTITY(' +
|
||||||
|
cast (ident_seed(so.name) as varchar) + ',' +
|
||||||
|
cast (ident_incr(so.name) as varchar) + ')'
|
||||||
|
else ''
|
||||||
|
end + ' ' +
|
||||||
|
(case when IS_NULLABLE = 'No' then 'NOT ' else '' end ) + 'NULL ' +
|
||||||
|
case when information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN 'DEFAULT '+ information_schema.columns.COLUMN_DEFAULT ELSE '' END + ', '
|
||||||
|
from information_schema.columns where table_name = so.name
|
||||||
|
order by ordinal_position
|
||||||
|
FOR XML PATH ('')) o (list)
|
||||||
|
left join
|
||||||
|
information_schema.table_constraints tc
|
||||||
|
on tc.Table_name = so.Name
|
||||||
|
AND tc.Constraint_Type = 'PRIMARY KEY'
|
||||||
|
cross apply
|
||||||
|
(select '[' + Column_Name + '], '
|
||||||
|
FROM information_schema.key_column_usage kcu
|
||||||
|
WHERE kcu.Constraint_Name = tc.Constraint_Name
|
||||||
|
ORDER BY
|
||||||
|
ORDINAL_POSITION
|
||||||
|
FOR XML PATH ('')) j (list)
|
||||||
|
where xtype = 'U'
|
||||||
|
AND name = '${tableName}'
|
||||||
|
</select>
|
||||||
|
|
||||||
<select id="getTableList" resultType="com.zyplayer.doc.db.framework.db.dto.TableInfoDto">
|
<select id="getTableList" resultType="com.zyplayer.doc.db.framework.db.dto.TableInfoDto">
|
||||||
SELECT NAME as tableName, ID as tableId
|
SELECT NAME as tableName, ID as tableId
|
||||||
FROM ${dbName}..SysObjects Where XType='U' ORDER BY NAME
|
FROM ${dbName}..SysObjects Where XType='U' ORDER BY NAME
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package com.zyplayer.doc.db.framework.db.sql.dialect.mysql;
|
package com.zyplayer.doc.db.framework.db.sql.dialect.mysql;
|
||||||
|
|
||||||
import com.alibaba.druid.DbType;
|
import com.alibaba.druid.DbType;
|
||||||
import com.alibaba.druid.sql.SQLUtils;
|
|
||||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
|
||||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||||
@@ -21,8 +19,8 @@ import com.alibaba.druid.sql.parser.SQLParserUtils;
|
|||||||
import com.alibaba.druid.util.FnvHash;
|
import com.alibaba.druid.util.FnvHash;
|
||||||
import com.zyplayer.doc.db.framework.db.sql.dialect.mysql.function.MySqlToOracleFunctionTransform;
|
import com.zyplayer.doc.db.framework.db.sql.dialect.mysql.function.MySqlToOracleFunctionTransform;
|
||||||
import com.zyplayer.doc.db.framework.db.sql.dialect.mysql.util.MySqlSQLDataTypeTransformUtil;
|
import com.zyplayer.doc.db.framework.db.sql.dialect.mysql.util.MySqlSQLDataTypeTransformUtil;
|
||||||
import com.zyplayer.doc.db.framework.db.sql.dialect.oracle.function.OracleUtil;
|
|
||||||
import com.zyplayer.doc.db.framework.utils.MapCacheUtil;
|
import com.zyplayer.doc.db.framework.utils.MapCacheUtil;
|
||||||
|
import com.zyplayer.doc.db.framework.utils.SQLTransformUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -67,7 +65,7 @@ public class MySqlToOracleOutputVisitor extends MySqlOutputVisitor {
|
|||||||
String columnName = sqlColumnDefinition.getName().getSimpleName().replaceAll("\"", "");
|
String columnName = sqlColumnDefinition.getName().getSimpleName().replaceAll("\"", "");
|
||||||
columnName = columnName.replaceAll("`", "");
|
columnName = columnName.replaceAll("`", "");
|
||||||
sqlColumnDefinition.setName(columnName);
|
sqlColumnDefinition.setName(columnName);
|
||||||
if(OracleUtil.containsKeyWords(columnName)){
|
if(SQLTransformUtils.containsKeyWords(columnName,DbType.oracle)){
|
||||||
sqlColumnDefinition.setName("\""+columnName+"\"");
|
sqlColumnDefinition.setName("\""+columnName+"\"");
|
||||||
}
|
}
|
||||||
sqlColumnDefinition.setDataType(MySqlSQLDataTypeTransformUtil.transformMySqlToOracle(SQLParserUtils.createExprParser(sqlColumnDefinition.getDataType().toString(), DbType.mysql).parseDataType()));
|
sqlColumnDefinition.setDataType(MySqlSQLDataTypeTransformUtil.transformMySqlToOracle(SQLParserUtils.createExprParser(sqlColumnDefinition.getDataType().toString(), DbType.mysql).parseDataType()));
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
package com.zyplayer.doc.db.framework.db.sql.dialect.mysql.util;
|
|
||||||
|
|
||||||
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlLexer;
|
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mysql sql语句相关工具类
|
|
||||||
*
|
|
||||||
* @author diantu
|
|
||||||
* @since 2023年1月29日
|
|
||||||
*/
|
|
||||||
public class MySqlUtil {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否包含关键词
|
|
||||||
* @param name
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static boolean containsKeyWords(String name) {
|
|
||||||
if (StringUtils.isEmpty(name)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return MySqlLexer.DEFAULT_MYSQL_KEYWORDS.getKeywords().containsKey(name.toUpperCase());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -17,10 +17,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUnique;
|
|||||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
|
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
|
||||||
import com.alibaba.druid.sql.parser.SQLParserUtils;
|
import com.alibaba.druid.sql.parser.SQLParserUtils;
|
||||||
import com.alibaba.druid.util.FnvHash;
|
import com.alibaba.druid.util.FnvHash;
|
||||||
import com.zyplayer.doc.db.framework.db.sql.dialect.mysql.util.MySqlUtil;
|
|
||||||
import com.zyplayer.doc.db.framework.db.sql.dialect.oracle.function.OracleToMySqlFunctionTransform;
|
import com.zyplayer.doc.db.framework.db.sql.dialect.oracle.function.OracleToMySqlFunctionTransform;
|
||||||
import com.zyplayer.doc.db.framework.db.sql.dialect.oracle.util.OracleSQLDataTypeTransformUtil;
|
import com.zyplayer.doc.db.framework.db.sql.dialect.oracle.util.OracleSQLDataTypeTransformUtil;
|
||||||
import com.zyplayer.doc.db.framework.utils.MapCacheUtil;
|
import com.zyplayer.doc.db.framework.utils.MapCacheUtil;
|
||||||
|
import com.zyplayer.doc.db.framework.utils.SQLTransformUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -62,7 +62,7 @@ public class OracleToMySqlOutputVisitor extends OracleOutputVisitor {
|
|||||||
SQLColumnDefinition sqlColumnDefinition = ((SQLColumnDefinition)sqlTableElement);
|
SQLColumnDefinition sqlColumnDefinition = ((SQLColumnDefinition)sqlTableElement);
|
||||||
String columnName = sqlColumnDefinition.getName().getSimpleName().replaceAll("\"", "");
|
String columnName = sqlColumnDefinition.getName().getSimpleName().replaceAll("\"", "");
|
||||||
sqlColumnDefinition.setName(columnName);
|
sqlColumnDefinition.setName(columnName);
|
||||||
if(MySqlUtil.containsKeyWords(columnName)){
|
if(SQLTransformUtils.containsKeyWords(columnName,DbType.mysql)){
|
||||||
sqlColumnDefinition.setName("`"+columnName+"`");
|
sqlColumnDefinition.setName("`"+columnName+"`");
|
||||||
}
|
}
|
||||||
sqlColumnDefinition.setDataType(OracleSQLDataTypeTransformUtil.transformOracleToMySql(SQLParserUtils.createExprParser(sqlColumnDefinition.getDataType().toString(), DbType.oracle).parseDataType()));
|
sqlColumnDefinition.setDataType(OracleSQLDataTypeTransformUtil.transformOracleToMySql(SQLParserUtils.createExprParser(sqlColumnDefinition.getDataType().toString(), DbType.oracle).parseDataType()));
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
package com.zyplayer.doc.db.framework.db.sql.dialect.oracle.function;
|
|
||||||
|
|
||||||
import com.alibaba.druid.sql.dialect.oracle.parser.OracleLexer;
|
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* oracle sql语句相关工具类
|
|
||||||
*
|
|
||||||
* @author diantu
|
|
||||||
* @since 2023年1月30日
|
|
||||||
*/
|
|
||||||
public class OracleUtil {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否包含关键词
|
|
||||||
* @param name
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static boolean containsKeyWords(String name) {
|
|
||||||
if (StringUtils.isEmpty(name)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return OracleLexer.DEFAULT_ORACLE_KEYWORDS.getKeywords().containsKey(name.toUpperCase());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -235,14 +235,8 @@ public class OracleSQLDataTypeTransformUtil extends SQLTransformUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if (len >= 0) {
|
|
||||||
if (len > 6) {
|
|
||||||
len = 6;
|
|
||||||
}
|
|
||||||
dataType = new SQLDataTypeImpl("datetime", len);
|
|
||||||
} else {*/
|
|
||||||
dataType = new SQLDataTypeImpl("datetime");
|
dataType = new SQLDataTypeImpl("datetime");
|
||||||
/* }*/
|
|
||||||
} else if (nameHash == FnvHash.Constants.BLOB
|
} else if (nameHash == FnvHash.Constants.BLOB
|
||||||
|| nameHash == FnvHash.Constants.LONG_RAW) {
|
|| nameHash == FnvHash.Constants.LONG_RAW) {
|
||||||
argumentns.clear();
|
argumentns.clear();
|
||||||
|
|||||||
@@ -0,0 +1,130 @@
|
|||||||
|
package com.zyplayer.doc.db.framework.db.sql.dialect.sqlserver;
|
||||||
|
|
||||||
|
import com.alibaba.druid.DbType;
|
||||||
|
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||||
|
import com.alibaba.druid.sql.ast.SQLIndexDefinition;
|
||||||
|
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||||
|
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||||
|
import com.alibaba.druid.sql.ast.statement.*;
|
||||||
|
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
|
||||||
|
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor;
|
||||||
|
import com.alibaba.druid.sql.parser.SQLParserUtils;
|
||||||
|
import com.alibaba.druid.util.FnvHash;
|
||||||
|
import com.zyplayer.doc.db.framework.db.sql.dialect.sqlserver.function.SqlServerToMySqlFunctionTransform;
|
||||||
|
import com.zyplayer.doc.db.framework.db.sql.dialect.sqlserver.util.SqlServerSQLDataTypeTransformUtil;
|
||||||
|
import com.zyplayer.doc.db.framework.utils.MapCacheUtil;
|
||||||
|
import com.zyplayer.doc.db.framework.utils.SQLTransformUtils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sqlserver转mysql遍历实现
|
||||||
|
*
|
||||||
|
* @author diantu
|
||||||
|
* @since 2023年2月2日
|
||||||
|
*/
|
||||||
|
public class SqlServerToMySqlOutputVisitor extends SQLServerOutputVisitor {
|
||||||
|
|
||||||
|
// 目标数据库类型
|
||||||
|
private final DbType distDbType = DbType.mysql;
|
||||||
|
|
||||||
|
private final SqlServerToMySqlFunctionTransform functionTransform = new SqlServerToMySqlFunctionTransform();
|
||||||
|
|
||||||
|
public SqlServerToMySqlOutputVisitor(Appendable appender) {
|
||||||
|
super(appender);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SqlServerToMySqlOutputVisitor(Appendable appender, boolean printPostSemi) {
|
||||||
|
super(appender, printPostSemi);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sqlserver建表语句遍历
|
||||||
|
* @param x
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean visit(SQLCreateTableStatement x) {
|
||||||
|
MySqlCreateTableStatement mySqlCreateTableStatement = new MySqlCreateTableStatement();
|
||||||
|
mySqlCreateTableStatement.setTableSource(x.getTableSource());
|
||||||
|
String tableName = x.getTableSource().getName().getSimpleName();
|
||||||
|
String name = String.valueOf(x.getName()).replaceAll("\"", "");
|
||||||
|
name = name.replaceAll("\\[", "").replaceAll("\\]", "");
|
||||||
|
mySqlCreateTableStatement.setName(name);
|
||||||
|
for(SQLTableElement sqlTableElement : x.getTableElementList()){
|
||||||
|
if( sqlTableElement instanceof SQLColumnDefinition) {
|
||||||
|
SQLColumnDefinition sqlColumnDefinition = ((SQLColumnDefinition)sqlTableElement);
|
||||||
|
String columnName = sqlColumnDefinition.getName().getSimpleName().replaceAll("\"", "");
|
||||||
|
columnName = columnName.replaceAll("\\[", "").replaceAll("\\]", "");
|
||||||
|
sqlColumnDefinition.setName(columnName);
|
||||||
|
if(SQLTransformUtils.containsKeyWords(columnName,DbType.mysql)){
|
||||||
|
sqlColumnDefinition.setName("`"+columnName+"`");
|
||||||
|
}
|
||||||
|
sqlColumnDefinition.setDataType(SqlServerSQLDataTypeTransformUtil.transformSqlServerToMySql(SQLParserUtils.createExprParser(sqlColumnDefinition.getDataType().toString(), DbType.oracle).parseDataType()));
|
||||||
|
if(sqlColumnDefinition.getDefaultExpr() != null) {
|
||||||
|
SQLExpr expr = sqlColumnDefinition.getDefaultExpr();
|
||||||
|
if(expr instanceof SQLMethodInvokeExpr) {
|
||||||
|
SQLMethodInvokeExpr sqlMethodInvokeExpr = (SQLMethodInvokeExpr) expr;
|
||||||
|
final long nameHashCode64 = sqlMethodInvokeExpr.methodNameHashCode64();
|
||||||
|
//mysql默认值只能为常量
|
||||||
|
if (nameHashCode64 == FnvHash.Constants.IDENTITY) {
|
||||||
|
SQLIdentifierExpr xx = new SQLIdentifierExpr("AUTO_INCREMENT");
|
||||||
|
xx.setParent(expr.getParent());
|
||||||
|
sqlColumnDefinition.setDefaultExpr(xx);
|
||||||
|
}else {
|
||||||
|
functionTransform.methodInvoke((SQLMethodInvokeExpr) sqlColumnDefinition.getDefaultExpr());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sqlColumnDefinition.setDbType(distDbType);
|
||||||
|
MapCacheUtil.getInstance().addCacheData(tableName.toUpperCase() + ":" + columnName.toUpperCase(), sqlColumnDefinition.toString().replaceAll(sqlColumnDefinition.getColumnName(), ""));
|
||||||
|
mySqlCreateTableStatement.getTableElementList().add(sqlColumnDefinition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Objects.nonNull(x.getSelect())){
|
||||||
|
x.setParent(mySqlCreateTableStatement);
|
||||||
|
mySqlCreateTableStatement.setSelect(x.getSelect());
|
||||||
|
}
|
||||||
|
println();
|
||||||
|
print(mySqlCreateTableStatement.toString());
|
||||||
|
println(";");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sqlserver修改语句遍历
|
||||||
|
* @param x
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean visit(SQLAlterTableStatement x) {
|
||||||
|
for (SQLAlterTableItem item : x.getItems()) {
|
||||||
|
if(item instanceof SQLAlterTableRename) {
|
||||||
|
((SQLAlterTableStatement) item.getParent()).setDbType(distDbType);
|
||||||
|
String rename = "";
|
||||||
|
if(x.isAfterSemi()) {
|
||||||
|
rename = x.toString().substring(0, x.toString().length() - 1);
|
||||||
|
} else {
|
||||||
|
rename = x.toString();
|
||||||
|
}
|
||||||
|
println();
|
||||||
|
print0(rename);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(item instanceof SQLAlterTableAddConstraint) {
|
||||||
|
((SQLAlterTableStatement) item.getParent()).setDbType(distDbType);
|
||||||
|
SQLPrimaryKeyImpl sQLPrimaryKeyImpl = (SQLPrimaryKeyImpl) ((SQLAlterTableAddConstraint) item).getConstraint();
|
||||||
|
SQLIndexDefinition sQLIndexDefinition = sQLPrimaryKeyImpl.getIndexDefinition();
|
||||||
|
List<SQLSelectOrderByItem> list = sQLIndexDefinition.getColumns();
|
||||||
|
for(int i=0;i<list.size();i++){
|
||||||
|
SQLIdentifierExpr sQLIdentifierExpr = (SQLIdentifierExpr)list.get(i).getExpr();
|
||||||
|
sQLIdentifierExpr.setName(sQLIdentifierExpr.getName().replaceAll("\\[", "").replaceAll("\\]", ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.visit(x);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.zyplayer.doc.db.framework.db.sql.dialect.sqlserver.function;
|
||||||
|
|
||||||
|
import com.zyplayer.doc.db.framework.db.sql.MethodInvoke;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sqlserver2mysql需要转换的函数
|
||||||
|
*
|
||||||
|
* @author diantu
|
||||||
|
* @since 2023年2月2日
|
||||||
|
*/
|
||||||
|
public interface SqlServerFunction extends MethodInvoke{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.zyplayer.doc.db.framework.db.sql.dialect.sqlserver.function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sqlserver2mysql需要转换的函数实现
|
||||||
|
*
|
||||||
|
* @author diantu
|
||||||
|
* @since 2023年2月2日
|
||||||
|
*/
|
||||||
|
public class SqlServerToMySqlFunctionTransform implements SqlServerFunction {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package com.zyplayer.doc.db.framework.db.sql.dialect.sqlserver.util;
|
||||||
|
|
||||||
|
import com.alibaba.druid.sql.SQLTransformUtils;
|
||||||
|
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||||
|
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
|
||||||
|
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||||
|
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
|
||||||
|
import com.alibaba.druid.util.FnvHash;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sqlserver sql转换工具类
|
||||||
|
*
|
||||||
|
* @author diantu
|
||||||
|
* @since 2023年2月2日
|
||||||
|
*/
|
||||||
|
public class SqlServerSQLDataTypeTransformUtil extends SQLTransformUtils {
|
||||||
|
|
||||||
|
public static SQLDataType transformSqlServerToMySql(SQLDataType x) {
|
||||||
|
final String name = x.getName();
|
||||||
|
final long nameHash = x.nameHashCode64();
|
||||||
|
if (name == null) {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
List<SQLExpr> argumentns = x.getArguments();
|
||||||
|
SQLDataType dataType;
|
||||||
|
if (nameHash == FnvHash.Constants.SMALLINT) {
|
||||||
|
int precision = 0;
|
||||||
|
if (argumentns.size() > 0) {
|
||||||
|
precision = ((SQLIntegerExpr) argumentns.get(0)).getNumber().intValue();
|
||||||
|
}
|
||||||
|
dataType = new SQLDataTypeImpl("int", precision);
|
||||||
|
|
||||||
|
} else if (nameHash == FnvHash.Constants.TIME) {
|
||||||
|
dataType = new SQLDataTypeImpl("datetime");
|
||||||
|
|
||||||
|
} else if (nameHash == FnvHash.Constants.TEXT) {
|
||||||
|
dataType = new SQLDataTypeImpl("MEDIUMTEXT");
|
||||||
|
|
||||||
|
} else if(nameHash == FnvHash.Constants.NVARCHAR){
|
||||||
|
int precision = 0;
|
||||||
|
if (argumentns.size() > 0) {
|
||||||
|
precision = ((SQLIntegerExpr) argumentns.get(0)).getNumber().intValue();
|
||||||
|
}
|
||||||
|
dataType = new SQLDataTypeImpl("varchar", precision);
|
||||||
|
} else {
|
||||||
|
dataType = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dataType != x) {
|
||||||
|
dataType.setParent(x.getParent());
|
||||||
|
}
|
||||||
|
|
||||||
|
return dataType;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,8 +3,15 @@ package com.zyplayer.doc.db.framework.utils;
|
|||||||
import com.alibaba.druid.DbType;
|
import com.alibaba.druid.DbType;
|
||||||
import com.alibaba.druid.sql.SQLUtils;
|
import com.alibaba.druid.sql.SQLUtils;
|
||||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||||
|
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlLexer;
|
||||||
|
import com.alibaba.druid.sql.dialect.oracle.parser.OracleLexer;
|
||||||
|
import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerLexer;
|
||||||
|
import com.alibaba.druid.sql.parser.Keywords;
|
||||||
|
import com.alibaba.druid.sql.parser.Lexer;
|
||||||
import com.zyplayer.doc.db.framework.db.sql.dialect.mysql.MySqlToOracleOutputVisitor;
|
import com.zyplayer.doc.db.framework.db.sql.dialect.mysql.MySqlToOracleOutputVisitor;
|
||||||
import com.zyplayer.doc.db.framework.db.sql.dialect.oracle.OracleToMySqlOutputVisitor;
|
import com.zyplayer.doc.db.framework.db.sql.dialect.oracle.OracleToMySqlOutputVisitor;
|
||||||
|
import com.zyplayer.doc.db.framework.db.sql.dialect.sqlserver.SqlServerToMySqlOutputVisitor;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -38,6 +45,24 @@ public class SQLTransformUtils {
|
|||||||
return mysqlSql;
|
return mysqlSql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sqlserver sql语句转换为mysql sql语句
|
||||||
|
* @param sql
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String translateSqlServerToMySql(String sql) {
|
||||||
|
List<SQLStatement> stmtList = SQLUtils.toStatementList(sql, DbType.sqlserver);
|
||||||
|
StringBuilder out = new StringBuilder();
|
||||||
|
SqlServerToMySqlOutputVisitor visitor = new SqlServerToMySqlOutputVisitor(out, false);
|
||||||
|
|
||||||
|
for(int i = 0; i < stmtList.size(); ++i) {
|
||||||
|
((SQLStatement)stmtList.get(i)).accept(visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
String mysqlSql = out.toString();
|
||||||
|
return mysqlSql;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mysql sql语句转换为oracle sql语句
|
* mysql sql语句转换为oracle sql语句
|
||||||
* @param sql
|
* @param sql
|
||||||
@@ -79,4 +104,26 @@ public class SQLTransformUtils {
|
|||||||
reString = sb.toString();
|
reString = sb.toString();
|
||||||
return reString;
|
return reString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否包含关键词
|
||||||
|
* @param name 字段名
|
||||||
|
* @param dbType 数据库类型
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean containsKeyWords(String name,DbType dbType) {
|
||||||
|
if (StringUtils.isEmpty(name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(dbType == DbType.mysql){
|
||||||
|
return MySqlLexer.DEFAULT_MYSQL_KEYWORDS.getKeywords().containsKey(name.toUpperCase());
|
||||||
|
}else if(dbType == DbType.oracle){
|
||||||
|
return OracleLexer.DEFAULT_ORACLE_KEYWORDS.getKeywords().containsKey(name.toUpperCase());
|
||||||
|
}else if(dbType == DbType.sqlserver){
|
||||||
|
return SQLServerLexer.DEFAULT_SQL_SERVER_KEYWORDS.getKeywords().containsKey(name.toUpperCase());
|
||||||
|
}else if(dbType == DbType.dm){
|
||||||
|
return Keywords.DM_KEYWORDS.getKeywords().containsKey(name.toUpperCase());
|
||||||
|
}
|
||||||
|
return Keywords.DEFAULT_KEYWORDS.getKeywords().containsKey(name.toUpperCase());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ public class OracleServiceImpl extends DbBaseService {
|
|||||||
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
||||||
List<Map<String, Object>> tableDdlList = baseMapper.getTableDdl(dbName, tableName);
|
List<Map<String, Object>> tableDdlList = baseMapper.getTableDdl(dbName, tableName);
|
||||||
TableDdlVo tableDdlVo = new TableDdlVo();
|
TableDdlVo tableDdlVo = new TableDdlVo();
|
||||||
tableDdlVo.setCurrent(DatabaseProductEnum.MYSQL.name().toLowerCase());
|
tableDdlVo.setCurrent(DatabaseProductEnum.ORACLE.name().toLowerCase());
|
||||||
if (CollectionUtils.isNotEmpty(tableDdlList)) {
|
if (CollectionUtils.isNotEmpty(tableDdlList)) {
|
||||||
String oracleSql = "";
|
String oracleSql = "";
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -2,14 +2,21 @@ package com.zyplayer.doc.db.service.database;
|
|||||||
|
|
||||||
import com.zyplayer.doc.db.controller.param.DataViewParam;
|
import com.zyplayer.doc.db.controller.param.DataViewParam;
|
||||||
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
import com.zyplayer.doc.db.controller.vo.TableColumnVo;
|
||||||
|
import com.zyplayer.doc.db.controller.vo.TableDdlVo;
|
||||||
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
|
import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto;
|
||||||
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
|
import com.zyplayer.doc.db.framework.db.enums.DatabaseProductEnum;
|
||||||
|
import com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper;
|
||||||
import com.zyplayer.doc.db.framework.db.mapper.sqlserver.SqlServerMapper;
|
import com.zyplayer.doc.db.framework.db.mapper.sqlserver.SqlServerMapper;
|
||||||
|
import com.zyplayer.doc.db.framework.utils.SQLTransformUtils;
|
||||||
import com.zyplayer.doc.db.service.download.SqlserverDownloadService;
|
import com.zyplayer.doc.db.service.download.SqlserverDownloadService;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.sql.Clob;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -123,4 +130,36 @@ public class SqlserverServiceImpl extends DbBaseService {
|
|||||||
}
|
}
|
||||||
return sqlSb.toString();
|
return sqlSb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取建表语句
|
||||||
|
*
|
||||||
|
* @author diantu
|
||||||
|
* @since 2023年2月2日
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public TableDdlVo getTableDdl(Long sourceId, String dbName, String tableName) {
|
||||||
|
BaseMapper baseMapper = this.getViewAuthBaseMapper(sourceId);
|
||||||
|
List<Map<String, Object>> tableDdlList = baseMapper.getTableDdl(dbName, tableName);
|
||||||
|
TableDdlVo tableDdlVo = new TableDdlVo();
|
||||||
|
tableDdlVo.setCurrent(DatabaseProductEnum.SQLSERVER.name().toLowerCase());
|
||||||
|
if (CollectionUtils.isNotEmpty(tableDdlList)) {
|
||||||
|
String sqlserverSql = "";
|
||||||
|
try {
|
||||||
|
sqlserverSql = SQLTransformUtils.ClobToString((Clob)tableDdlList.get(0).get(""));
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
//String sqlserverSql = (String) tableDdlList.get(0).get("");
|
||||||
|
tableDdlVo.setSqlserver(sqlserverSql);
|
||||||
|
// tableDdlVo.setOracle(oracleSql);
|
||||||
|
//oracle建表语句转换为mysql建表语句
|
||||||
|
String mysqlSql = SQLTransformUtils.translateSqlServerToMySql(sqlserverSql);
|
||||||
|
tableDdlVo.setMysql(mysqlSql);
|
||||||
|
// TODO 其他数据库同理
|
||||||
|
}
|
||||||
|
return tableDdlVo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user