From ea83639365a3e105edbd65ad048ac7d0b3eec75b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Thu, 19 Oct 2023 14:22:04 +0800 Subject: [PATCH] feat: optimize dialect for codegen --- ...cDialect.java => AbstractJdbcDialect.java} | 24 ++++--- .../mybatisflex/codegen/dialect/IDialect.java | 61 +++------------- .../dialect/impl/DefaultJdbcDialect.java | 29 ++++++++ .../dialect/impl/MySqlJdbcDialect.java | 29 ++++++++ .../dialect/impl/OracleJdbcDialect.java | 69 +++++++++++++++++++ .../dialect/{ => impl}/SqliteDialect.java | 4 +- 6 files changed, 152 insertions(+), 64 deletions(-) rename mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/{JdbcDialect.java => AbstractJdbcDialect.java} (96%) create mode 100644 mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/DefaultJdbcDialect.java create mode 100644 mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/MySqlJdbcDialect.java create mode 100644 mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/OracleJdbcDialect.java rename mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/{ => impl}/SqliteDialect.java (96%) diff --git a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/JdbcDialect.java b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/AbstractJdbcDialect.java similarity index 96% rename from mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/JdbcDialect.java rename to mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/AbstractJdbcDialect.java index 112ed488..a88868a6 100644 --- a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/JdbcDialect.java +++ b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/AbstractJdbcDialect.java @@ -25,10 +25,9 @@ import java.util.Map; /** * 默认方言抽象类。 - * * @author michael */ -public abstract class JdbcDialect implements IDialect { +public abstract class AbstractJdbcDialect implements IDialect { @Override public void buildTableColumns(String schemaName, Table table, GlobalConfig globalConfig, DatabaseMetaData dbMeta, Connection conn) throws SQLException { @@ -79,15 +78,6 @@ public abstract class JdbcDialect implements IDialect { return dbMeta.getTables(conn.getCatalog(), schema, null, types); } - /** - * 构建查询所有数据的 SQL 语句。 - * - * @param schema 模式 - * @param tableName 表名 - * @return 全量查询 SQL 语句 - */ - abstract String forBuildColumnsSql(String schema, String tableName); - /** * 构建 remarks 的 ResultSet @@ -104,4 +94,16 @@ public abstract class JdbcDialect implements IDialect { } + /** + * 构建查询所有数据的 SQL 语句。 + * + * @param schema 模式 + * @param tableName 表名 + * @return 全量查询 SQL 语句 + */ + protected abstract String forBuildColumnsSql(String schema, String tableName); + + + + } 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 543f98eb..67ab6b5b 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,15 +15,13 @@ */ package com.mybatisflex.codegen.dialect; -import com.alibaba.druid.pool.DruidPooledConnection; import com.mybatisflex.codegen.config.GlobalConfig; +import com.mybatisflex.codegen.dialect.impl.DefaultJdbcDialect; +import com.mybatisflex.codegen.dialect.impl.MySqlJdbcDialect; +import com.mybatisflex.codegen.dialect.impl.OracleJdbcDialect; +import com.mybatisflex.codegen.dialect.impl.SqliteDialect; 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; @@ -31,66 +29,25 @@ import java.sql.SQLException; /** * 方言接口。 + * @author michael + * @author Suomm */ public interface IDialect { /** * 默认方言。 */ - IDialect DEFAULT = new JdbcDialect() { - @Override - String forBuildColumnsSql(String schema, String tableName) { - return "SELECT * FROM " + (StringUtil.isNotBlank(schema) ? schema + "." : "") + tableName + " WHERE 1 = 2"; - } - }; + IDialect DEFAULT = new DefaultJdbcDialect(); /** * MySQL 方言。 */ - IDialect MYSQL = new JdbcDialect() { - @Override - String forBuildColumnsSql(String schema, String tableName) { - return "SELECT * FROM `" + (StringUtil.isNotBlank(schema) ? schema + "`.`" : "") + tableName + "` WHERE 1 = 2"; - } - }; + IDialect MYSQL = new MySqlJdbcDialect(); /** * Oracle 方言。 */ - IDialect ORACLE = new JdbcDialect() { - @Override - public String forBuildColumnsSql(String schema, String tableName) { - return "SELECT * FROM \"" + (StringUtil.isNotBlank(schema) ? schema + "\".\"" : "") + tableName + "\" WHERE rownum < 1"; - } - - @Override - public ResultSet getTablesResultSet(DatabaseMetaData dbMeta, Connection conn, String schema, String[] types) throws SQLException { - return dbMeta.getTables(conn.getCatalog(), StringUtil.isNotBlank(schema) ? schema : dbMeta.getUserName(), null, types); - } - - @Override - protected ResultSet forRemarks(String schema, Table table, DatabaseMetaData dbMeta, Connection conn) throws SQLException { - 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)); - } - 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); - } - } - }; + IDialect ORACLE = new OracleJdbcDialect(); /** * Sqlite 方言。 diff --git a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/DefaultJdbcDialect.java b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/DefaultJdbcDialect.java new file mode 100644 index 00000000..8161e36b --- /dev/null +++ b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/DefaultJdbcDialect.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mybatisflex.codegen.dialect.impl; + +import com.mybatisflex.codegen.dialect.AbstractJdbcDialect; +import com.mybatisflex.core.util.StringUtil; + +/** + * @author michael + */ +public class DefaultJdbcDialect extends AbstractJdbcDialect { + @Override + protected String forBuildColumnsSql(String schema, String tableName) { + return "SELECT * FROM " + (StringUtil.isNotBlank(schema) ? schema + "." : "") + tableName + " WHERE 1 = 2"; + } +} diff --git a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/MySqlJdbcDialect.java b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/MySqlJdbcDialect.java new file mode 100644 index 00000000..a8d94f53 --- /dev/null +++ b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/MySqlJdbcDialect.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mybatisflex.codegen.dialect.impl; + +import com.mybatisflex.codegen.dialect.AbstractJdbcDialect; +import com.mybatisflex.core.util.StringUtil; + +/** + * @author michael + */ +public class MySqlJdbcDialect extends AbstractJdbcDialect { + @Override + protected String forBuildColumnsSql(String schema, String tableName) { + return "SELECT * FROM `" + (StringUtil.isNotBlank(schema) ? schema + "`.`" : "") + tableName + "` WHERE 1 = 2"; + } +} diff --git a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/OracleJdbcDialect.java b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/OracleJdbcDialect.java new file mode 100644 index 00000000..a2e21110 --- /dev/null +++ b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/OracleJdbcDialect.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mybatisflex.codegen.dialect.impl; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.mybatisflex.codegen.dialect.AbstractJdbcDialect; +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; + +/** + * @author michael + */ +public class OracleJdbcDialect extends AbstractJdbcDialect { + + @Override + public String forBuildColumnsSql(String schema, String tableName) { + return "SELECT * FROM \"" + (StringUtil.isNotBlank(schema) ? schema + "\".\"" : "") + tableName + "\" WHERE rownum < 1"; + } + + @Override + public ResultSet getTablesResultSet(DatabaseMetaData dbMeta, Connection conn, String schema, String[] types) throws SQLException { + return dbMeta.getTables(conn.getCatalog(), StringUtil.isNotBlank(schema) ? schema : dbMeta.getUserName(), null, types); + } + + @Override + protected ResultSet forRemarks(String schema, Table table, DatabaseMetaData dbMeta, Connection conn) throws SQLException { + 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)); + } + 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/main/java/com/mybatisflex/codegen/dialect/SqliteDialect.java b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/SqliteDialect.java similarity index 96% rename from mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/SqliteDialect.java rename to mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/SqliteDialect.java index 1d68ddb5..6a5e2f62 100644 --- a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/SqliteDialect.java +++ b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/dialect/impl/SqliteDialect.java @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.mybatisflex.codegen.dialect; +package com.mybatisflex.codegen.dialect.impl; import com.mybatisflex.codegen.config.GlobalConfig; +import com.mybatisflex.codegen.dialect.IDialect; import com.mybatisflex.codegen.entity.Column; import com.mybatisflex.codegen.entity.Table; @@ -25,6 +26,7 @@ import java.sql.*; /** * Sqlite 方言实现。 + * @author michael */ public class SqliteDialect implements IDialect {