From 3058dc1f83e4c2dcd0e1679091d5870593580f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Fri, 14 Jul 2023 14:19:50 +0800 Subject: [PATCH] refactor: optimize oracle dialect --- mybatis-flex-codegen/pom.xml | 25 ++++++++--- .../mybatisflex/codegen/dialect/IDialect.java | 41 ++++++++++--------- .../codegen/test/GeneratorTest.java | 3 +- .../codegen/test/SqliteGeneratorTest.java | 18 +++++--- 4 files changed, 55 insertions(+), 32 deletions(-) diff --git a/mybatis-flex-codegen/pom.xml b/mybatis-flex-codegen/pom.xml index 302c6a6f..469d4a9f 100644 --- a/mybatis-flex-codegen/pom.xml +++ b/mybatis-flex-codegen/pom.xml @@ -32,12 +32,6 @@ ${mybatis-flex.version} - - com.oracle.ojdbc - ojdbc8 - 19.3.0.0 - - @@ -66,6 +60,14 @@ + + com.oracle.ojdbc + ojdbc8 + 19.3.0.0 + true + + + com.zaxxer HikariCP @@ -75,6 +77,15 @@ + + com.alibaba + druid + 1.2.18 + compile + true + + + org.projectlombok lombok @@ -97,6 +108,8 @@ test + + diff --git a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/IDialect.java b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/IDialect.java index ae74beb1..eb0763fd 100644 --- a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/IDialect.java +++ b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/IDialect.java @@ -15,19 +15,19 @@ */ package com.mybatisflex.codegen.dialect; +import com.alibaba.druid.pool.DruidPooledConnection; import com.mybatisflex.codegen.config.GlobalConfig; import com.mybatisflex.codegen.entity.Table; import com.mybatisflex.core.util.ClassUtil; import com.mybatisflex.core.util.StringUtil; - import com.zaxxer.hikari.pool.HikariProxyConnection; +import oracle.jdbc.driver.OracleConnection; + import java.lang.reflect.Field; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.function.Predicate; -import oracle.jdbc.driver.OracleConnection; /** * 方言接口。 @@ -70,23 +70,26 @@ public interface IDialect { @Override protected ResultSet forRemarks(String schema, Table table, DatabaseMetaData dbMeta, Connection conn) throws SQLException { - HikariProxyConnection hikariProxyConnection = (HikariProxyConnection) conn; - Field delegate = ClassUtil.getFirstField(HikariProxyConnection.class, new Predicate() { - @Override - public boolean test(Field field) { - return field.getName().equals("delegate"); - } - }); - delegate.setAccessible(true); - OracleConnection oc; - try { - oc = (OracleConnection) delegate.get(hikariProxyConnection); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); + if (conn instanceof OracleConnection){ + ((OracleConnection) conn).setRemarksReporting(true); + return dbMeta.getColumns(conn.getCatalog(), StringUtil.isNotBlank(schema) ? schema : dbMeta.getUserName(), table.getName(), null); + }else if ("com.zaxxer.hikari.pool.HikariProxyConnection".equals(conn.getClass().getName())){ + return forRemarks(schema,table,dbMeta,getOriginalConn(HikariProxyConnection.class,"delegate",conn)); + }else if ("com.alibaba.druid.pool.DruidPooledConnection".equals(conn.getClass().getName())){ + return forRemarks(schema,table,dbMeta,getOriginalConn(DruidPooledConnection.class,"conn",conn)); } - oc.setRemarksReporting(true); - return dbMeta.getColumns(oc.getCatalog(), StringUtil.isNotBlank(schema) ? schema : dbMeta.getUserName(), table.getName(), null); - } + return null; + } + + private Connection getOriginalConn(Class clazz,String attr,Connection conn){ + Field delegate = ClassUtil.getFirstField(clazz, field -> field.getName().equals(attr)); + try { + delegate.setAccessible(true); + return (Connection) delegate.get(conn); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } }; /** diff --git a/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/GeneratorTest.java b/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/GeneratorTest.java index e6a7244d..24081993 100644 --- a/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/GeneratorTest.java +++ b/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/GeneratorTest.java @@ -23,7 +23,6 @@ import com.mybatisflex.codegen.config.TableConfig; import com.mybatisflex.codegen.config.TableDefConfig; import com.mybatisflex.spring.service.impl.CacheableServiceImpl; import com.zaxxer.hikari.HikariDataSource; -import org.junit.Test; import java.util.function.UnaryOperator; @@ -149,7 +148,7 @@ public class GeneratorTest { generator.generate(); } - @Test +// @Test public void testCodeGen3() { //配置数据源 HikariDataSource dataSource = new HikariDataSource(); diff --git a/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/SqliteGeneratorTest.java b/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/SqliteGeneratorTest.java index b7a63d5f..62c9f0b1 100644 --- a/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/SqliteGeneratorTest.java +++ b/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/SqliteGeneratorTest.java @@ -16,22 +16,30 @@ package com.mybatisflex.codegen.test; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; import com.mybatisflex.codegen.Generator; import com.mybatisflex.codegen.config.GlobalConfig; import com.mybatisflex.codegen.dialect.IDialect; -import com.zaxxer.hikari.HikariDataSource; +import org.junit.Test; +import javax.sql.DataSource; import java.sql.Connection; import java.sql.Statement; public class SqliteGeneratorTest { - // @Test +// @Test public void testGenerator3() { //配置数据源 - HikariDataSource dataSource = new HikariDataSource(); - dataSource.setJdbcUrl("jdbc:sqlite:sample.db"); +// HikariDataSource dataSource = new HikariDataSource(); +// dataSource.setJdbcUrl("jdbc:sqlite:sample.db"); +// //dataSource.setUsername("root"); +// //dataSource.setPassword("123456"); + + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:sqlite:sample.db"); //dataSource.setUsername("root"); //dataSource.setPassword("123456"); @@ -62,7 +70,7 @@ public class SqliteGeneratorTest { generator.generate(); } - private void createTestTable(HikariDataSource dataSource) { + private void createTestTable(DataSource dataSource) { try { Connection connection = dataSource.getConnection();