diff --git a/src/main/java/META-INF/root-context.xml b/src/main/java/META-INF/root-context.xml index 03972a2287ba94a03f99ba5279eee76fa60e96c0..60f38ce9aae994bfe16c4dd26434de3067ed113f 100644 --- a/src/main/java/META-INF/root-context.xml +++ b/src/main/java/META-INF/root-context.xml @@ -99,6 +99,17 @@ + + + + + mysql + oceanbase + tidb + + + + @@ -108,6 +119,7 @@ classpath*:neatlogic/framework/**/mapper/*.xml + diff --git a/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java b/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..e01091b78f861e2c2bb1c187a5df034bd1bb88a4 --- /dev/null +++ b/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java @@ -0,0 +1,97 @@ +package neatlogic.framework.dao.plugin; + +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; +import org.apache.ibatis.mapping.DatabaseIdProvider; + +import javax.sql.DataSource; +import java.sql.*; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; + +public class NeatLogicDatabaseIdProvider implements DatabaseIdProvider { + + private final String MYSQL = "MySQL"; + private final String TIDB = "TiDB"; + private final String OCEAN_BASE = "OceanBase"; + + private String databaseId; + private Properties properties; + + public NeatLogicDatabaseIdProvider() { + + } + @Override + public void setProperties(Properties p) { + this.properties = p; + } + + @Override + public String getDatabaseId(DataSource dataSource) throws SQLException { + if (databaseId != null) { + return databaseId; + } + if (dataSource == null) { + throw new NullPointerException("dataSource cannot be null"); + } + try { + databaseId = getDatabaseName(dataSource); + } catch (Exception e) { + LogHolder.log.error("Could not get a databaseId from dataSource", e); + } + return databaseId; + } + + private String getDatabaseName(DataSource dataSource) throws SQLException { + String productName = getDatabaseProductName(dataSource); + if (this.properties != null) { + for (Map.Entry property : properties.entrySet()) { + if (productName.contains((String) property.getKey())) { + return (String) property.getValue(); + } + } + // no match, return null + return null; + } + return productName; + } + + private String getDatabaseProductName(DataSource dataSource) throws SQLException { + try (Connection con = dataSource.getConnection()) { + DatabaseMetaData metaData = con.getMetaData(); + String databaseProductName = metaData.getDatabaseProductName(); + if (Objects.equals(databaseProductName, MYSQL)) { + Statement statement = null; + ResultSet resultSet = null; + try { + statement = con.createStatement(); + resultSet = statement.executeQuery("SELECT @@version"); + while (resultSet.next()) { + String databaseProductVersion = resultSet.getString(1); + if (databaseProductVersion.contains(TIDB)) {// 8.0.11-TiDB-v7.4.0 + databaseProductName = TIDB; + } else if (databaseProductVersion.contains(OCEAN_BASE)) {// 5.7.25-OceanBase_CE-v4.2.0.0 + databaseProductName = OCEAN_BASE; + } + break; + } + } catch (Exception e) { + LogHolder.log.error(e.getMessage(), e); + } finally { + if (resultSet != null) { + resultSet.close(); + } + if (statement != null) { + statement.close(); + } + } + } + return databaseProductName; + } + } + + private static class LogHolder { + private static final Log log = LogFactory.getLog(NeatLogicDatabaseIdProvider.class); + } +} diff --git a/src/main/java/neatlogic/framework/framework-servlet-context.xml b/src/main/java/neatlogic/framework/framework-servlet-context.xml index fc919c0245cd7b0b8c4a1c34e148cc5c3b92e31e..286e0b3120c7d801114cfa5eca77415ac5e950d1 100644 --- a/src/main/java/neatlogic/framework/framework-servlet-context.xml +++ b/src/main/java/neatlogic/framework/framework-servlet-context.xml @@ -51,6 +51,7 @@ +