mirror of
https://gitee.com/dromara/dbswitch.git
synced 2025-09-07 04:37:48 +00:00
version for 1.6.11 : support SQLite
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<groupId>com.gitee.dbswitch</groupId>
|
||||
<artifactId>dbswitch-parent</artifactId>
|
||||
<version>1.6.10</version>
|
||||
<version>1.6.11</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>dbswitch-core</artifactId>
|
||||
@@ -41,6 +41,11 @@
|
||||
<artifactId>ojdbc8</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.oracle.ojdbc</groupId>
|
||||
<artifactId>orai18n</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.microsoft.sqlserver</groupId>
|
||||
@@ -110,6 +115,12 @@
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.xerial</groupId>
|
||||
<artifactId>sqlite-jdbc</artifactId>
|
||||
<version>3.31.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.hive</groupId>
|
||||
<artifactId>hive-jdbc</artifactId>
|
||||
|
@@ -19,11 +19,12 @@ import com.gitee.dbswitch.core.database.impl.DatabaseMariaDBImpl;
|
||||
import com.gitee.dbswitch.core.database.impl.DatabaseMysqlImpl;
|
||||
import com.gitee.dbswitch.core.database.impl.DatabaseOracleImpl;
|
||||
import com.gitee.dbswitch.core.database.impl.DatabasePostgresImpl;
|
||||
import com.gitee.dbswitch.core.database.impl.DatabaseSqliteImpl;
|
||||
import com.gitee.dbswitch.core.database.impl.DatabaseSqlserver2000Impl;
|
||||
import com.gitee.dbswitch.core.database.impl.DatabaseSqlserverImpl;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import javax.sql.DataSource;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
/**
|
||||
* 数据库实例构建工厂类
|
||||
@@ -32,30 +33,32 @@ import javax.sql.DataSource;
|
||||
*/
|
||||
public final class DatabaseFactory {
|
||||
|
||||
private static final Map<DatabaseTypeEnum, String> DATABASE_MAPPER = new HashMap<DatabaseTypeEnum, String>() {
|
||||
private static final Map<DatabaseTypeEnum, Callable<AbstractDatabase>> DATABASE_MAPPER
|
||||
= new HashMap<DatabaseTypeEnum, Callable<AbstractDatabase>>() {
|
||||
|
||||
private static final long serialVersionUID = 9202705534880971997L;
|
||||
|
||||
{
|
||||
put(DatabaseTypeEnum.MYSQL, DatabaseMysqlImpl.class.getName());
|
||||
put(DatabaseTypeEnum.ORACLE, DatabaseOracleImpl.class.getName());
|
||||
put(DatabaseTypeEnum.SQLSERVER2000, DatabaseSqlserver2000Impl.class.getName());
|
||||
put(DatabaseTypeEnum.SQLSERVER, DatabaseSqlserverImpl.class.getName());
|
||||
put(DatabaseTypeEnum.POSTGRESQL, DatabasePostgresImpl.class.getName());
|
||||
put(DatabaseTypeEnum.GREENPLUM, DatabaseGreenplumImpl.class.getName());
|
||||
put(DatabaseTypeEnum.MARIADB, DatabaseMariaDBImpl.class.getName());
|
||||
put(DatabaseTypeEnum.DB2, DatabaseDB2Impl.class.getName());
|
||||
put(DatabaseTypeEnum.DM, DatabaseDmImpl.class.getName());
|
||||
put(DatabaseTypeEnum.KINGBASE, DatabaseKingbaseImpl.class.getName());
|
||||
put(DatabaseTypeEnum.HIVE, DatabaseHiveImpl.class.getName());
|
||||
put(DatabaseTypeEnum.MYSQL, DatabaseMysqlImpl::new);
|
||||
put(DatabaseTypeEnum.ORACLE, DatabaseOracleImpl::new);
|
||||
put(DatabaseTypeEnum.SQLSERVER2000, DatabaseSqlserver2000Impl::new);
|
||||
put(DatabaseTypeEnum.SQLSERVER, DatabaseSqlserverImpl::new);
|
||||
put(DatabaseTypeEnum.POSTGRESQL, DatabasePostgresImpl::new);
|
||||
put(DatabaseTypeEnum.GREENPLUM, DatabaseGreenplumImpl::new);
|
||||
put(DatabaseTypeEnum.MARIADB, DatabaseMariaDBImpl::new);
|
||||
put(DatabaseTypeEnum.DB2, DatabaseDB2Impl::new);
|
||||
put(DatabaseTypeEnum.DM, DatabaseDmImpl::new);
|
||||
put(DatabaseTypeEnum.KINGBASE, DatabaseKingbaseImpl::new);
|
||||
put(DatabaseTypeEnum.HIVE, DatabaseHiveImpl::new);
|
||||
put(DatabaseTypeEnum.SQLITE3, DatabaseSqliteImpl::new);
|
||||
}
|
||||
};
|
||||
|
||||
public static AbstractDatabase getDatabaseInstance(DatabaseTypeEnum type) {
|
||||
if (DATABASE_MAPPER.containsKey(type)) {
|
||||
String className = DATABASE_MAPPER.get(type);
|
||||
Callable<AbstractDatabase> callable = DATABASE_MAPPER.get(type);
|
||||
if (null != callable) {
|
||||
try {
|
||||
return (AbstractDatabase) Class.forName(className).newInstance();
|
||||
return callable.call();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
@@ -66,6 +69,7 @@ public final class DatabaseFactory {
|
||||
}
|
||||
|
||||
private DatabaseFactory() {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,164 @@
|
||||
// Copyright tang. All rights reserved.
|
||||
// https://gitee.com/inrgihc/dbswitch
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
//
|
||||
// Author: tang (inrgihc@126.com)
|
||||
// Date : 2020/1/2
|
||||
// Location: beijing , china
|
||||
/////////////////////////////////////////////////////////////
|
||||
package com.gitee.dbswitch.core.database.impl;
|
||||
|
||||
import com.gitee.dbswitch.common.constant.Const;
|
||||
import com.gitee.dbswitch.common.type.DatabaseTypeEnum;
|
||||
import com.gitee.dbswitch.core.database.AbstractDatabase;
|
||||
import com.gitee.dbswitch.core.database.IDatabaseInterface;
|
||||
import com.gitee.dbswitch.core.model.ColumnDescription;
|
||||
import com.gitee.dbswitch.core.model.ColumnMetaData;
|
||||
import com.gitee.dbswitch.core.model.TableDescription;
|
||||
import com.gitee.dbswitch.core.util.DDLFormatterUtils;
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 支持SQLite数据库的元信息实现
|
||||
*
|
||||
* @author tang
|
||||
*/
|
||||
public class DatabaseSqliteImpl extends AbstractDatabase implements IDatabaseInterface {
|
||||
|
||||
public DatabaseSqliteImpl() {
|
||||
super("org.sqlite.JDBC");
|
||||
}
|
||||
|
||||
@Override
|
||||
public DatabaseTypeEnum getDatabaseType() {
|
||||
return DatabaseTypeEnum.SQLITE3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> querySchemaList(Connection connection) {
|
||||
return Collections.singletonList("main");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTableDDL(Connection connection, String schemaName, String tableName) {
|
||||
String sql = "SELECT sql FROM \"sqlite_master\" where type='table' and tbl_name=? ";
|
||||
try (PreparedStatement ps = connection.prepareStatement(sql)) {
|
||||
ps.setString(1, tableName);
|
||||
try (ResultSet rs = ps.executeQuery()) {
|
||||
if (rs != null && rs.next()) {
|
||||
return DDLFormatterUtils.format(rs.getString(1));
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getViewDDL(Connection connection, String schemaName, String tableName) {
|
||||
String sql = "SELECT sql FROM \"sqlite_master\" where type='view' and tbl_name=? ";
|
||||
try (PreparedStatement ps = connection.prepareStatement(sql)) {
|
||||
ps.setString(1, tableName);
|
||||
try (ResultSet rs = ps.executeQuery()) {
|
||||
if (rs != null && rs.next()) {
|
||||
return DDLFormatterUtils.format(rs.getString(1));
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ColumnDescription> querySelectSqlColumnMeta(Connection connection, String sql) {
|
||||
String querySQL = String.format(" %s LIMIT 0 ", sql.replace(";", ""));
|
||||
return this.getSelectSqlColumnMeta(connection, querySQL);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTableFieldsQuerySQL(String schemaName, String tableName) {
|
||||
return String.format("SELECT * FROM \"%s\".\"%s\" ", schemaName, tableName);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTestQuerySQL(String sql) {
|
||||
return String.format("explain %s", sql.replace(";", ""));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldDefinition(ColumnMetaData v, List<String> pks, boolean useAutoInc,
|
||||
boolean addCr, boolean withRemarks) {
|
||||
String fieldname = v.getName();
|
||||
int length = v.getLength();
|
||||
int precision = v.getPrecision();
|
||||
int type = v.getType();
|
||||
|
||||
String retval = " \"" + fieldname + "\" ";
|
||||
|
||||
switch (type) {
|
||||
case ColumnMetaData.TYPE_TIMESTAMP:
|
||||
case ColumnMetaData.TYPE_TIME:
|
||||
case ColumnMetaData.TYPE_DATE:
|
||||
// sqlite中没有时间数据类型
|
||||
retval += "DATETIME";
|
||||
break;
|
||||
case ColumnMetaData.TYPE_BOOLEAN:
|
||||
retval += "CHAR(1)";
|
||||
break;
|
||||
case ColumnMetaData.TYPE_NUMBER:
|
||||
case ColumnMetaData.TYPE_INTEGER:
|
||||
case ColumnMetaData.TYPE_BIGNUMBER:
|
||||
if (null != pks && !pks.isEmpty() && pks.contains(fieldname)) {
|
||||
// 关键字 AUTOINCREMENT 只能⽤于整型(INTEGER)字段。
|
||||
if (useAutoInc) {
|
||||
retval += "INTEGER PRIMARY KEY AUTOINCREMENT";
|
||||
} else {
|
||||
retval += "BIGINT ";
|
||||
}
|
||||
} else {
|
||||
if (precision != 0 || length < 0 || length > 18) {
|
||||
retval += "NUMERIC";
|
||||
} else {
|
||||
retval += "INTEGER";
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ColumnMetaData.TYPE_STRING:
|
||||
if (length < 1 || length >= AbstractDatabase.CLOB_LENGTH) {
|
||||
retval += "BLOB";
|
||||
} else {
|
||||
retval += "TEXT";
|
||||
}
|
||||
break;
|
||||
case ColumnMetaData.TYPE_BINARY:
|
||||
retval += "BLOB";
|
||||
break;
|
||||
default:
|
||||
retval += "TEXT";
|
||||
break;
|
||||
}
|
||||
|
||||
if (addCr) {
|
||||
retval += Const.CR;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTableColumnCommentDefinition(TableDescription td,
|
||||
List<ColumnDescription> cds) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
}
|
@@ -26,7 +26,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
*
|
||||
* @author tang
|
||||
*/
|
||||
public class GenerateSqlUtils {
|
||||
public final class GenerateSqlUtils {
|
||||
|
||||
public static String getDDLCreateTableSQL(
|
||||
DatabaseTypeEnum type,
|
||||
@@ -108,7 +108,7 @@ public class GenerateSqlUtils {
|
||||
AbstractDatabase db = DatabaseFactory.getDatabaseInstance(type);
|
||||
String createTableSql = getDDLCreateTableSQL(db, fieldNames, primaryKeys, schemaName,
|
||||
tableName, true, tableRemarks, autoIncr);
|
||||
if (DatabaseTypeEnum.MYSQL == type || DatabaseTypeEnum.HIVE == type) {
|
||||
if (type.noCommentStatement()) {
|
||||
return Arrays.asList(createTableSql);
|
||||
}
|
||||
|
||||
@@ -122,4 +122,8 @@ public class GenerateSqlUtils {
|
||||
return results;
|
||||
}
|
||||
|
||||
private GenerateSqlUtils() {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -126,11 +126,11 @@ public class JdbcUrlUtils {
|
||||
// + "(CONNECT_DATA=(SERVICE_NAME=%s)))",
|
||||
/// db.getHost(), db.getPort(), db.getDbname());
|
||||
//
|
||||
// (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.207.158)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))
|
||||
// (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.20.58)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))
|
||||
//
|
||||
// or
|
||||
//
|
||||
// (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.207.158)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl.ruijie.com.cn)))
|
||||
// (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.20.58)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl.test.com.cn)))
|
||||
return String.format("jdbc:oracle:thin:@%s", db.getDbname());
|
||||
} else {
|
||||
return String.format("jdbc:oracle:thin:@%s:%d:%s",
|
||||
|
@@ -18,5 +18,7 @@ public final class PostgresUtils {
|
||||
}
|
||||
|
||||
private PostgresUtils() {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user