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