Sfoglia il codice sorgente

适配达梦数据库

hexiao 1 anno fa
parent
commit
0e04a9ff4f

+ 6 - 0
base-framework/pom.xml

@@ -60,6 +60,12 @@
             <artifactId>base-system</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.dm</groupId>
+            <artifactId>DmJdbcDriver18</artifactId>
+            <version>1.8</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 5 - 0
base-framework/src/main/java/com/ozs/framework/config/CipherMybatisPlusConfig.java

@@ -36,6 +36,11 @@ public class CipherMybatisPlusConfig {
             interceptor.addInnerInterceptor(new KindBaseSqlMybatisIntercepts(dbname));
         }
 
+        // 自定义拦截器,先添加先执行。
+        if (type.equals(DbType.DM.getDb())) {
+            interceptor.addInnerInterceptor(new DMSqlMybatisIntercepts(dbname));
+        }
+
         // 自带分页拦截器
 //        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.getDbType(type)));
         return interceptor;

+ 82 - 0
base-framework/src/main/java/com/ozs/framework/config/DMSqlMybatisIntercepts.java

@@ -0,0 +1,82 @@
+package com.ozs.framework.config;
+
+import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
+import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
+import com.baomidou.mybatisplus.core.toolkit.TableNameParser;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DMSqlMybatisIntercepts implements InnerInterceptor {
+
+    private String dbname;
+
+    // 重写查询方法修改表名
+    @Override
+    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
+        PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
+        if (!InterceptorIgnoreHelper.willIgnoreDynamicTableName(ms.getId())) {
+            // 非忽略执行
+            mpBs.sql(this.changeTable(mpBs.sql()));
+        }
+    }
+
+    // 重写 插入、删除、修改方法的表名
+    @Override
+    public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
+        PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh);
+        MappedStatement ms = mpSh.mappedStatement();
+        SqlCommandType sct = ms.getSqlCommandType();
+        if (sct == SqlCommandType.INSERT || sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) {
+            if (!InterceptorIgnoreHelper.willIgnoreDynamicTableName(ms.getId())) {
+                // 非忽略执行
+                PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
+                mpBs.sql(this.changeTable(mpBs.sql()));
+            }
+        }
+    }
+
+    protected String changeTable(String sql) {
+        TableNameParser parser = new TableNameParser(sql);
+        List<TableNameParser.SqlToken> names = new ArrayList<>();
+        parser.accept(names::add);
+        StringBuilder builder = new StringBuilder();
+        int last = 0;
+        for (TableNameParser.SqlToken name : names) {
+            String tname = name.toString();
+            int start = name.getStart();
+            if (start != last) {
+                builder.append(sql, last, start);
+                builder.append(dbname + ".");
+                builder.append("\"");
+                builder.append(tname);
+                builder.append("\"");
+            }
+            last = name.getEnd();
+        }
+
+
+        if (last != sql.length()) {
+            builder.append(sql.substring(last));
+        }
+
+        return builder.toString();
+    }
+}