diff --git a/README.md b/README.md
index ac700bc..557c746 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
MiniDao
=======
-当前最新版本: 1.9.6 (发布日期:20240107)
+当前最新版本: 1.10.1 (发布日期:2024-07-03)
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
[](http://jeecg.com/aboutusIndex)
[](https://jeecg.blog.csdn.net)
-[](https://github.com/zhangdaiscott/jeecg-boot)
+[](https://github.com/zhangdaiscott/jeecg-boot)
[](https://github.com/zhangdaiscott/jeecg-boot)
[](https://github.com/zhangdaiscott/jeecg-boot)
@@ -45,7 +45,7 @@ MiniDao 是一款轻量级JAVA持久层框架,基于 SpringJdbc + freemarker
org.jeecgframework.boot3
minidao-spring-boot-starter
- 1.9.6
+ 1.10.1
```
diff --git "a/docs/\344\277\256\346\224\271\346\227\245\345\277\227.log" "b/docs/\344\277\256\346\224\271\346\227\245\345\277\227.log"
index 310e2a4..a26477b 100644
--- "a/docs/\344\277\256\346\224\271\346\227\245\345\277\227.log"
+++ "b/docs/\344\277\256\346\224\271\346\227\245\345\277\227.log"
@@ -63,3 +63,27 @@ minidao-pe/src/main/java/org/jeecgframework/minidao/aop/MiniDaoHandler.java
minidao-pe-example/src/test/java/test/spring/SpringTxTestCase.java
---author:chenrui---date:2024/1/8-----for:[QQYUN-7775]minidao springboot3版本打包,报junit错误---
+
+
+---author:chenrui---date:20240321-----for:minidao-pe-example去掉老的p3代码生成器的相关代码,导致单元测试不输出日志---
+minidao-pe-example/jeecg\codegenerate\OneToMainUtil.java(-)
+minidao-pe-example/jeecg\codegenerate\CodeGenerateUtil.java(-)
+minidao-pe-example/jeecg\aop\MinidaoInterceptor.java(-)
+minidao-pe-example/examples\util\JdbcUtils.java(-)
+minidao-pe-example/pom.xml
+---author:chenrui---date:20240321-----for:minidao-pe-example去掉老的p3代码生成器的相关代码,导致单元测试不输出日志---
+
+---author:scott---date:2024-07-04-----for:SQL解析兼容机制(判断支持JSqlParser,才用JSqlParser引擎)---
+// 默认可不引入jsqlparser依赖,避免版本冲突问题
+org/jeecgframework/minidao/aop/MiniDaoHandler.java
+org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServerDialect.java
+org/jeecgframework/minidao/sqlparser/impl/util/JSqlCountSqlParser.java 更名路径
+org/jeecgframework/minidao/sqlparser/impl/util/JSqlRemoveSqlOrderBy.java 更名路径
+org/jeecgframework/minidao/sqlparser/impl/util/JSqlServerPagesHelper.java 更名路径
+org/jeecgframework/minidao/sqlparser/impl/util/JSqlSubSelectBody.java 更名路径
+org/jeecgframework/minidao/sqlparser/impl/JsqlparserSqlProcessor.java(+)
+org/jeecgframework/minidao/sqlparser/impl/SimpleSqlProcessor.java(+)
+org/jeecgframework/minidao/sqlparser/AbstractSqlProcessor.java(+)
+org/jeecgframework/minidao/util/MiniDaoUtil.java
+org/jeecgframework/minidao/util/ReflectUtil.java
+---author:scott---date:2024-07-04-----for:SQL解析兼容机制(判断支持JSqlParser,才用JSqlParser引擎)---
\ No newline at end of file
diff --git a/minidao-pe-example/pom.xml b/minidao-pe-example/pom.xml
index 20b24bb..6368cab 100644
--- a/minidao-pe-example/pom.xml
+++ b/minidao-pe-example/pom.xml
@@ -3,28 +3,28 @@
4.0.0
org.jeecgframework.boot3
minidao-pe-example
- 1.9.6
+ 1.10.1
jar
http://www.jeecg.com
org.jeecgframework.boot3
minidao-parent
- 1.9.6
+ 1.10.1
- 1.9.6
+ 1.10.1
4.13.1
6.0.13
8.0.21
- 42.2.6
+ 42.4.3
11.2.0.3
4.0
2.6.2
- 3.7.2
+ 3.41.2.2
- 1.2.20
+ 1.2.22
1.2.16
@@ -64,7 +64,7 @@
minidao-pe
${minidao.version}
-
+
+
com.alibaba
druid
@@ -187,19 +189,19 @@
org.hsqldb
hsqldb
- 2.2.8
+ 2.7.1
com.h2database
h2
- 1.4.197
+ 2.2.220
org.apache.derby
derby
- 10.9.1.0
+ 10.17.1.0
org.apache.derby
@@ -218,10 +220,9 @@
jcc
11.5.0.0
-
-
+
@@ -271,6 +272,4 @@
-
-
\ No newline at end of file
diff --git a/minidao-pe-example/src/main/java/examples/util/JdbcUtils.java b/minidao-pe-example/src/main/java/examples/util/JdbcUtils.java
index 0349a42..74ee6d3 100644
--- a/minidao-pe-example/src/main/java/examples/util/JdbcUtils.java
+++ b/minidao-pe-example/src/main/java/examples/util/JdbcUtils.java
@@ -1,979 +1,979 @@
-package examples.util;
-
-import com.alibaba.druid.DbType;
-import com.alibaba.druid.support.logging.Log;
-import com.alibaba.druid.support.logging.LogFactory;
-import com.alibaba.druid.util.*;
-
-import javax.sql.DataSource;
-import java.io.Closeable;
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.net.URL;
-import java.sql.*;
-import java.util.*;
-import java.util.Date;
-
-import static com.alibaba.druid.util.JdbcConstants.*;
-
-/**
- * @Description: TODO
- * @author: lsq
- * @date: 2021年07月22日 11:54
- */
-public class JdbcUtils {
- private final static Log LOG = LogFactory.getLog(JdbcUtils.class);
-
- private static final Properties DRIVER_URL_MAPPING = new Properties();
-
- private static Boolean mysql_driver_version_6 = null;
-
- static {
- try {
- ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader();
- if (ctxClassLoader != null) {
- for (Enumeration e = ctxClassLoader.getResources("META-INF/druid-driver.properties"); e.hasMoreElements();) {
- URL url = e.nextElement();
-
- Properties property = new Properties();
-
- InputStream is = null;
- try {
- is = url.openStream();
- property.load(is);
- } finally {
- JdbcUtils.close(is);
- }
-
- DRIVER_URL_MAPPING.putAll(property);
- }
- }
- } catch (Exception e) {
- LOG.error("load druid-driver.properties error", e);
- }
- }
-
- public static void close(Connection x) {
- if (x == null) {
- return;
- }
-
- try {
- if (x.isClosed()) {
- return;
- }
-
- x.close();
- } catch (SQLRecoverableException e) {
- // skip
- } catch (Exception e) {
- LOG.debug("close connection error", e);
- }
- }
-
- public static void close(Statement x) {
- if (x == null) {
- return;
- }
- try {
- x.close();
- } catch (Exception e) {
- boolean printError = true;
-
- if (e instanceof SQLRecoverableException
- && "Closed Connection".equals(e.getMessage())
- ) {
- printError = false;
- }
-
- if (printError) {
- LOG.debug("close statement error", e);
- }
- }
- }
-
- public static void close(ResultSet x) {
- if (x == null) {
- return;
- }
- try {
- x.close();
- } catch (Exception e) {
- LOG.debug("close result set error", e);
- }
- }
-
- public static void close(Closeable x) {
- if (x == null) {
- return;
- }
-
- try {
- x.close();
- } catch (Exception e) {
- LOG.debug("close error", e);
- }
- }
-
- public static void close(Blob x) {
- if (x == null) {
- return;
- }
-
- try {
- x.free();
- } catch (Exception e) {
- LOG.debug("close error", e);
- }
- }
-
- public static void close(Clob x) {
- if (x == null) {
- return;
- }
-
- try {
- x.free();
- } catch (Exception e) {
- LOG.debug("close error", e);
- }
- }
-
- public static void printResultSet(ResultSet rs) throws SQLException {
- printResultSet(rs, System.out);
- }
-
- public static void printResultSet(ResultSet rs, PrintStream out) throws SQLException {
- printResultSet(rs, out, true, "\t");
- }
-
- public static void printResultSet(ResultSet rs, PrintStream out, boolean printHeader, String seperator) throws SQLException {
- ResultSetMetaData metadata = rs.getMetaData();
- int columnCount = metadata.getColumnCount();
- if (printHeader) {
- for (int columnIndex = 1; columnIndex <= columnCount; ++columnIndex) {
- if (columnIndex != 1) {
- out.print(seperator);
- }
- out.print(metadata.getColumnName(columnIndex));
- }
- }
-
- out.println();
-
- while (rs.next()) {
-
- for (int columnIndex = 1; columnIndex <= columnCount; ++columnIndex) {
- if (columnIndex != 1) {
- out.print(seperator);
- }
-
- int type = metadata.getColumnType(columnIndex);
-
- if (type == Types.VARCHAR || type == Types.CHAR || type == Types.NVARCHAR || type == Types.NCHAR) {
- out.print(rs.getString(columnIndex));
- } else if (type == Types.DATE) {
- Date date = rs.getDate(columnIndex);
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(date.toString());
- }
- } else if (type == Types.BIT) {
- boolean value = rs.getBoolean(columnIndex);
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(Boolean.toString(value));
- }
- } else if (type == Types.BOOLEAN) {
- boolean value = rs.getBoolean(columnIndex);
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(Boolean.toString(value));
- }
- } else if (type == Types.TINYINT) {
- byte value = rs.getByte(columnIndex);
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(Byte.toString(value));
- }
- } else if (type == Types.SMALLINT) {
- short value = rs.getShort(columnIndex);
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(Short.toString(value));
- }
- } else if (type == Types.INTEGER) {
- int value = rs.getInt(columnIndex);
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(Integer.toString(value));
- }
- } else if (type == Types.BIGINT) {
- long value = rs.getLong(columnIndex);
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(Long.toString(value));
- }
- } else if (type == Types.TIMESTAMP || type == 2014) {
- out.print(String.valueOf(rs.getTimestamp(columnIndex)));
- } else if (type == Types.DECIMAL) {
- out.print(String.valueOf(rs.getBigDecimal(columnIndex)));
- } else if (type == Types.CLOB) {
- out.print(String.valueOf(rs.getString(columnIndex)));
- } else if (type == Types.JAVA_OBJECT) {
- Object object = rs.getObject(columnIndex);
-
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(String.valueOf(object));
- }
- } else if (type == Types.LONGVARCHAR) {
- Object object = rs.getString(columnIndex);
-
- if (rs.wasNull()) {
- out.print("null");
- } else {
- out.print(String.valueOf(object));
- }
- } else if (type == Types.NULL) {
- out.print("null");
- } else {
- Object object = rs.getObject(columnIndex);
-
- if (rs.wasNull()) {
- out.print("null");
- } else {
- if (object instanceof byte[]) {
- byte[] bytes = (byte[]) object;
- String text = HexBin.encode(bytes);
- out.print(text);
- } else {
- out.print(String.valueOf(object));
- }
- }
- }
- }
- out.println();
- }
- }
-
- public static String getTypeName(int sqlType) {
- switch (sqlType) {
- case Types.ARRAY:
- return "ARRAY";
-
- case Types.BIGINT:
- return "BIGINT";
-
- case Types.BINARY:
- return "BINARY";
-
- case Types.BIT:
- return "BIT";
-
- case Types.BLOB:
- return "BLOB";
-
- case Types.BOOLEAN:
- return "BOOLEAN";
-
- case Types.CHAR:
- return "CHAR";
-
- case Types.CLOB:
- return "CLOB";
-
- case Types.DATALINK:
- return "DATALINK";
-
- case Types.DATE:
- return "DATE";
-
- case Types.DECIMAL:
- return "DECIMAL";
-
- case Types.DISTINCT:
- return "DISTINCT";
-
- case Types.DOUBLE:
- return "DOUBLE";
-
- case Types.FLOAT:
- return "FLOAT";
-
- case Types.INTEGER:
- return "INTEGER";
-
- case Types.JAVA_OBJECT:
- return "JAVA_OBJECT";
-
- case Types.LONGNVARCHAR:
- return "LONGNVARCHAR";
-
- case Types.LONGVARBINARY:
- return "LONGVARBINARY";
-
- case Types.NCHAR:
- return "NCHAR";
-
- case Types.NCLOB:
- return "NCLOB";
-
- case Types.NULL:
- return "NULL";
-
- case Types.NUMERIC:
- return "NUMERIC";
-
- case Types.NVARCHAR:
- return "NVARCHAR";
-
- case Types.REAL:
- return "REAL";
-
- case Types.REF:
- return "REF";
-
- case Types.ROWID:
- return "ROWID";
-
- case Types.SMALLINT:
- return "SMALLINT";
-
- case Types.SQLXML:
- return "SQLXML";
-
- case Types.STRUCT:
- return "STRUCT";
-
- case Types.TIME:
- return "TIME";
-
- case Types.TIMESTAMP:
- return "TIMESTAMP";
-
- case 2014:
- return "TIMESTAMP_WITH_TIMEZONE";
-
- case Types.TINYINT:
- return "TINYINT";
-
- case Types.VARBINARY:
- return "VARBINARY";
-
- case Types.VARCHAR:
- return "VARCHAR";
-
- default:
- return "OTHER";
-
- }
- }
-
- public static String getDriverClassName(String rawUrl) throws SQLException {
- if (rawUrl == null) {
- return null;
- }
- if (rawUrl.startsWith("jdbc:derby:")) {
- String prefix = "jdbc:derby:";
- if (rawUrl.startsWith(prefix + "//")) {
- return "org.apache.derby.jdbc.ClientDriver";
- }else{
- return "org.apache.derby.jdbc.EmbeddedDriver";
- }
- } else if (rawUrl.startsWith("jdbc:mysql:")) {
- if (mysql_driver_version_6 == null) {
- mysql_driver_version_6 = Utils.loadClass("com.mysql.cj.jdbc.Driver") != null;
- }
-
- if (mysql_driver_version_6) {
- return MYSQL_DRIVER_6;
- } else {
- return MYSQL_DRIVER;
- }
- } else if (rawUrl.startsWith("jdbc:log4jdbc:")) {
- return LOG4JDBC_DRIVER;
- } else if (rawUrl.startsWith("jdbc:mariadb:")) {
- return MARIADB_DRIVER;
- } else if (rawUrl.startsWith("jdbc:oracle:") //
- || rawUrl.startsWith("JDBC:oracle:")) {
- return ORACLE_DRIVER;
- } else if (rawUrl.startsWith("jdbc:alibaba:oracle:")) {
- return ALI_ORACLE_DRIVER;
- } else if (rawUrl.startsWith("jdbc:oceanbase:")) {
- return OCEANBASE_DRIVER;
- } else if (rawUrl.startsWith("jdbc:microsoft:")) {
- return "com.microsoft.jdbc.sqlserver.SQLServerDriver";
- } else if (rawUrl.startsWith("jdbc:sqlserver:")) {
- return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
- } else if (rawUrl.startsWith("jdbc:sybase:Tds:")) {
- return "com.sybase.jdbc2.jdbc.SybDriver";
- } else if (rawUrl.startsWith("jdbc:jtds:")) {
- return "net.sourceforge.jtds.jdbc.Driver";
- } else if (rawUrl.startsWith("jdbc:fake:") || rawUrl.startsWith("jdbc:mock:")) {
- return "com.alibaba.druid.mock.MockDriver";
- } else if (rawUrl.startsWith("jdbc:postgresql:")) {
- return POSTGRESQL_DRIVER;
- } else if (rawUrl.startsWith("jdbc:edb:")) {
- return ENTERPRISEDB_DRIVER;
- } else if (rawUrl.startsWith("jdbc:odps:")) {
- return ODPS_DRIVER;
- } else if (rawUrl.startsWith("jdbc:hsqldb:")) {
- return "org.hsqldb.jdbcDriver";
- } else if (rawUrl.startsWith("jdbc:db2:")) {
- // Resolve the DB2 driver from JDBC URL
- // Type2 COM.ibm.db2.jdbc.app.DB2Driver, url = jdbc:db2:databasename
- // Type3 COM.ibm.db2.jdbc.net.DB2Driver, url = jdbc:db2:ServerIP:6789:databasename
- // Type4 8.1+ com.ibm.db2.jcc.DB2Driver, url = jdbc:db2://ServerIP:50000/databasename
- String prefix = "jdbc:db2:";
- if (rawUrl.startsWith(prefix + "//")) { // Type4
- return DB2_DRIVER; // "com.ibm.db2.jcc.DB2Driver";
- } else {
- String suffix = rawUrl.substring(prefix.length());
- if (suffix.indexOf(':') > 0) { // Type3
- return DB2_DRIVER3; // COM.ibm.db2.jdbc.net.DB2Driver
- } else { // Type2
- return DB2_DRIVER2; // COM.ibm.db2.jdbc.app.DB2Driver
- }
- }
- } else if (rawUrl.startsWith("jdbc:sqlite:")) {
- return SQLITE_DRIVER;
- } else if (rawUrl.startsWith("jdbc:ingres:")) {
- return "com.ingres.jdbc.IngresDriver";
- } else if (rawUrl.startsWith("jdbc:h2:")) {
- return H2_DRIVER;
- } else if (rawUrl.startsWith("jdbc:mckoi:")) {
- return "com.mckoi.JDBCDriver";
- } else if (rawUrl.startsWith("jdbc:cloudscape:")) {
- return "COM.cloudscape.core.JDBCDriver";
- } else if (rawUrl.startsWith("jdbc:informix-sqli:")) {
- return "com.informix.jdbc.IfxDriver";
- } else if (rawUrl.startsWith("jdbc:timesten:")) {
- return "com.timesten.jdbc.TimesTenDriver";
- } else if (rawUrl.startsWith("jdbc:as400:")) {
- return "com.ibm.as400.access.AS400JDBCDriver";
- } else if (rawUrl.startsWith("jdbc:sapdb:")) {
- return "com.sap.dbtech.jdbc.DriverSapDB";
- } else if (rawUrl.startsWith("jdbc:JSQLConnect:")) {
- return "com.jnetdirect.jsql.JSQLDriver";
- } else if (rawUrl.startsWith("jdbc:JTurbo:")) {
- return "com.newatlanta.jturbo.driver.Driver";
- } else if (rawUrl.startsWith("jdbc:firebirdsql:")) {
- return "org.firebirdsql.jdbc.FBDriver";
- } else if (rawUrl.startsWith("jdbc:interbase:")) {
- return "interbase.interclient.Driver";
- } else if (rawUrl.startsWith("jdbc:pointbase:")) {
- return "com.pointbase.jdbc.jdbcUniversalDriver";
- } else if (rawUrl.startsWith("jdbc:edbc:")) {
- return "ca.edbc.jdbc.EdbcDriver";
- } else if (rawUrl.startsWith("jdbc:mimer:multi1:")) {
- return "com.mimer.jdbc.Driver";
- } else if (rawUrl.startsWith("jdbc:dm:")) {
- return JdbcConstants.DM_DRIVER;
- } else if (rawUrl.startsWith("jdbc:kingbase:")) {
- return JdbcConstants.KINGBASE_DRIVER;
- } else if (rawUrl.startsWith("jdbc:kingbase8:")) {
- return "com.kingbase8.Driver";
- } else if (rawUrl.startsWith("jdbc:oscar:")) {
- return "com.oscar.Driver";
- } else if (rawUrl.startsWith("jdbc:gbase:")) {
- return JdbcConstants.GBASE_DRIVER;
- } else if (rawUrl.startsWith("jdbc:xugu:")) {
- return JdbcConstants.XUGU_DRIVER;
- } else if (rawUrl.startsWith("jdbc:hive:")) {
- return JdbcConstants.HIVE_DRIVER;
- } else if (rawUrl.startsWith("jdbc:hive2:")) {
- return JdbcConstants.HIVE_DRIVER;
- } else if (rawUrl.startsWith("jdbc:phoenix:thin:")) {
- return "org.apache.phoenix.queryserver.client.Driver";
- } else if (rawUrl.startsWith("jdbc:phoenix://")) {
- return JdbcConstants.PHOENIX_DRIVER;
- } else if (rawUrl.startsWith("jdbc:kylin:")) {
- return JdbcConstants.KYLIN_DRIVER;
- } else if (rawUrl.startsWith("jdbc:elastic:")) {
- return JdbcConstants.ELASTIC_SEARCH_DRIVER;
- } else if (rawUrl.startsWith("jdbc:clickhouse:")) {
- return JdbcConstants.CLICKHOUSE_DRIVER;
- } else if(rawUrl.startsWith("jdbc:presto:")) {
- return JdbcConstants.PRESTO_DRIVER;
- } else if(rawUrl.startsWith("jdbc:trino:")) {
- return JdbcConstants.TRINO_DRIVER;
- } else if (rawUrl.startsWith("jdbc:inspur:")) {
- return JdbcConstants.KDB_DRIVER;
- } else if (rawUrl.startsWith("jdbc:polardb")) {
- return JdbcConstants.POLARDB_DRIVER;
- } else if (rawUrl.startsWith("jdbc:highgo:")) {
- return "com.highgo.jdbc.Driver";
- } else {
- throw new SQLException("unknown jdbc driver : " + rawUrl);
- }
- }
-
- public static DbType getDbTypeRaw(String rawUrl, String driverClassName) {
- if (rawUrl == null) {
- return null;
- }
-
- if (rawUrl.startsWith("jdbc:derby:") || rawUrl.startsWith("jdbc:log4jdbc:derby:")) {
- return DbType.derby;
- } else if (rawUrl.startsWith("jdbc:mysql:") || rawUrl.startsWith("jdbc:cobar:")
- || rawUrl.startsWith("jdbc:log4jdbc:mysql:")) {
- return DbType.mysql;
- } else if (rawUrl.startsWith("jdbc:mariadb:")) {
- return DbType.mariadb;
- } else if (rawUrl.startsWith("jdbc:oracle:") || rawUrl.startsWith("jdbc:log4jdbc:oracle:")) {
- return DbType.oracle;
- } else if (rawUrl.startsWith("jdbc:alibaba:oracle:")) {
- return DbType.ali_oracle;
- } else if (rawUrl.startsWith("jdbc:oceanbase:oracle:")) {
- return DbType.oceanbase_oracle;
- } else if (rawUrl.startsWith("jdbc:oceanbase:")) {
- return DbType.oceanbase;
- } else if (rawUrl.startsWith("jdbc:microsoft:") || rawUrl.startsWith("jdbc:log4jdbc:microsoft:")) {
- return DbType.sqlserver;
- } else if (rawUrl.startsWith("jdbc:sqlserver:") || rawUrl.startsWith("jdbc:log4jdbc:sqlserver:")) {
- return DbType.sqlserver;
- } else if (rawUrl.startsWith("jdbc:sybase:Tds:") || rawUrl.startsWith("jdbc:log4jdbc:sybase:")) {
- return DbType.sybase;
- } else if (rawUrl.startsWith("jdbc:jtds:") || rawUrl.startsWith("jdbc:log4jdbc:jtds:")) {
- return DbType.jtds;
- } else if (rawUrl.startsWith("jdbc:fake:") || rawUrl.startsWith("jdbc:mock:")) {
- return DbType.mock;
- } else if (rawUrl.startsWith("jdbc:postgresql:") || rawUrl.startsWith("jdbc:log4jdbc:postgresql:")) {
- return DbType.postgresql;
- } else if (rawUrl.startsWith("jdbc:edb:")) {
- return DbType.edb;
- } else if (rawUrl.startsWith("jdbc:hsqldb:") || rawUrl.startsWith("jdbc:log4jdbc:hsqldb:")) {
- return DbType.hsql;
- } else if (rawUrl.startsWith("jdbc:odps:")) {
- return DbType.odps;
- } else if (rawUrl.startsWith("jdbc:db2:")) {
- return DbType.db2;
- } else if (rawUrl.startsWith("jdbc:sqlite:")) {
- return DbType.sqlite;
- } else if (rawUrl.startsWith("jdbc:ingres:")) {
- return DbType.ingres;
- } else if (rawUrl.startsWith("jdbc:h2:") || rawUrl.startsWith("jdbc:log4jdbc:h2:")) {
- return DbType.h2;
- } else if (rawUrl.startsWith("jdbc:mckoi:")) {
- return DbType.mock;
- } else if (rawUrl.startsWith("jdbc:cloudscape:")) {
- return DbType.cloudscape;
- } else if (rawUrl.startsWith("jdbc:informix-sqli:") || rawUrl.startsWith("jdbc:log4jdbc:informix-sqli:")) {
- return DbType.informix;
- } else if (rawUrl.startsWith("jdbc:timesten:")) {
- return DbType.timesten;
- } else if (rawUrl.startsWith("jdbc:as400:")) {
- return DbType.as400;
- } else if (rawUrl.startsWith("jdbc:sapdb:")) {
- return DbType.sapdb;
- } else if (rawUrl.startsWith("jdbc:JSQLConnect:")) {
- return DbType.JSQLConnect;
- } else if (rawUrl.startsWith("jdbc:JTurbo:")) {
- return DbType.JTurbo;
- } else if (rawUrl.startsWith("jdbc:firebirdsql:")) {
- return DbType.firebirdsql;
- } else if (rawUrl.startsWith("jdbc:interbase:")) {
- return DbType.interbase;
- } else if (rawUrl.startsWith("jdbc:pointbase:")) {
- return DbType.pointbase;
- } else if (rawUrl.startsWith("jdbc:edbc:")) {
- return DbType.edbc;
- } else if (rawUrl.startsWith("jdbc:mimer:multi1:")) {
- return DbType.mimer;
- } else if (rawUrl.startsWith("jdbc:dm:")) {
- return JdbcConstants.DM;
- } else if (rawUrl.startsWith("jdbc:kingbase:") || rawUrl.startsWith("jdbc:kingbase8:")) {
- return JdbcConstants.KINGBASE;
- } else if (rawUrl.startsWith("jdbc:gbase:")) {
- return JdbcConstants.GBASE;
- } else if (rawUrl.startsWith("jdbc:xugu:")) {
- return JdbcConstants.XUGU;
- } else if (rawUrl.startsWith("jdbc:log4jdbc:")) {
- return DbType.log4jdbc;
- } else if (rawUrl.startsWith("jdbc:hive:")) {
- return DbType.hive;
- } else if (rawUrl.startsWith("jdbc:hive2:")) {
- return DbType.hive;
- } else if (rawUrl.startsWith("jdbc:phoenix:")) {
- return DbType.phoenix;
- } else if (rawUrl.startsWith("jdbc:kylin:")) {
- return DbType.kylin;
- } else if (rawUrl.startsWith("jdbc:elastic:")) {
- return DbType.elastic_search;
- } else if (rawUrl.startsWith("jdbc:clickhouse:")) {
- return DbType.clickhouse;
- } else if (rawUrl.startsWith("jdbc:presto:")) {
- return DbType.presto;
- } else if (rawUrl.startsWith("jdbc:inspur:")) {
- return DbType.kdb;
- } else if (rawUrl.startsWith("jdbc:polardb")) {
- return DbType.polardb;
- } else if (rawUrl.startsWith("jdbc:highgo:")) {
- return DbType.highgo;
- } else {
- return null;
- }
- }
-
- public static String getDbType(String rawUrl, String driverClassName) {
- DbType dbType = getDbTypeRaw(rawUrl, driverClassName);
-
- if (dbType == null) {
- return null;
- }
-
- return dbType.name();
- }
-
- public static Driver createDriver(String driverClassName) throws SQLException {
- return createDriver(null, driverClassName);
- }
-
- public static Driver createDriver(ClassLoader classLoader, String driverClassName) throws SQLException {
- Class> clazz = null;
- if (classLoader != null) {
- try {
- clazz = classLoader.loadClass(driverClassName);
- } catch (ClassNotFoundException e) {
- // skip
- }
- }
-
- if (clazz == null) {
- try {
- ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
- if (contextLoader != null) {
- clazz = contextLoader.loadClass(driverClassName);
- }
- } catch (ClassNotFoundException e) {
- // skip
- }
- }
-
- if (clazz == null) {
- try {
- clazz = Class.forName(driverClassName);
- } catch (ClassNotFoundException e) {
- throw new SQLException(e.getMessage(), e);
- }
- }
-
- try {
- return (Driver) clazz.newInstance();
- } catch (IllegalAccessException e) {
- throw new SQLException(e.getMessage(), e);
- } catch (InstantiationException e) {
- throw new SQLException(e.getMessage(), e);
- }
- }
-
- public static int executeUpdate(DataSource dataSource, String sql, Object... parameters) throws SQLException {
- return executeUpdate(dataSource, sql, Arrays.asList(parameters));
- }
-
- public static int executeUpdate(DataSource dataSource, String sql, List
+
+ junit
+ junit
+ ${junit.version}
+ test
+
@@ -107,10 +114,12 @@
${javassist.version}
+
com.github.jsqlparser
jsqlparser
${jsqlparser.version}
+ provided
jakarta.annotation
diff --git a/minidao-pe/src/main/java/org/jeecgframework/minidao/aop/MiniDaoHandler.java b/minidao-pe/src/main/java/org/jeecgframework/minidao/aop/MiniDaoHandler.java
index a92dbc9..10cbe53 100644
--- a/minidao-pe/src/main/java/org/jeecgframework/minidao/aop/MiniDaoHandler.java
+++ b/minidao-pe/src/main/java/org/jeecgframework/minidao/aop/MiniDaoHandler.java
@@ -1,7 +1,19 @@
package org.jeecgframework.minidao.aop;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import net.sf.jsqlparser.JSQLParserException;
+import netscape.javascript.JSException;
import ognl.Ognl;
import ognl.OgnlException;
+
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -14,7 +26,6 @@
import org.jeecgframework.minidao.aspect.EmptyInterceptor;
import org.jeecgframework.minidao.def.MiniDaoConstants;
import org.jeecgframework.minidao.pagehelper.dialect.PageAutoDialect;
-import org.jeecgframework.minidao.pagehelper.parser.CountSqlParser;
import org.jeecgframework.minidao.pojo.MiniDaoPage;
import org.jeecgframework.minidao.spring.rowMapper.MiniColumnMapRowMapper;
import org.jeecgframework.minidao.spring.rowMapper.MiniColumnOriginalMapRowMapper;
@@ -35,14 +46,6 @@
import org.springframework.jdbc.support.KeyHolder;
import javax.sql.DataSource;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
/**
*
@@ -69,7 +72,7 @@ public class MiniDaoHandler implements InvocationHandler {
@Lazy
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
/** minidao拦截器 */
- @Autowired
+ @Autowired(required = false)
@Lazy
private EmptyInterceptor emptyInterceptor;
@@ -90,8 +93,6 @@ public class MiniDaoHandler implements InvocationHandler {
//自定获取方言
protected PageAutoDialect pageAutoDialect = new PageAutoDialect();
- //处理SQL
- protected CountSqlParser countSqlParser = new CountSqlParser();
//序列查询sql
public static final String SEQ_NEXTVAL_SQL = "SELECT %s.nextval FROM DUAL";
@@ -417,11 +418,11 @@ private Object getReturnMinidaoResult(MiniDaoPage pageSetting, Method method, St
if (page != 0 && rows != 0) {
if (returnType.isAssignableFrom(MiniDaoPage.class)) {
if (paramMap != null) {
- String countsql = countSqlParser.getSmartCountSql(executeSql);
- logger.info("page countsql===> "+countsql);
+ String countsql = MiniDaoUtil.getCountSql(executeSql);
+ logger.info("page smart countsql===> "+countsql);
pageSetting.setTotal(namedParameterJdbcTemplate.queryForObject(countsql, paramMap, Integer.class));
} else {
- String countsql = countSqlParser.getSmartCountSql(executeSql);
+ String countsql = MiniDaoUtil.getCountSql(executeSql);
logger.info("page countsql===> "+countsql);
pageSetting.setTotal(jdbcTemplate.queryForObject(countsql, Integer.class));
}
diff --git a/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/AbstractDialect.java b/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/AbstractDialect.java
index 6ff9775..6c41a82 100644
--- a/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/AbstractDialect.java
+++ b/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/AbstractDialect.java
@@ -1,6 +1,5 @@
package org.jeecgframework.minidao.pagehelper.dialect;
-import org.jeecgframework.minidao.pagehelper.parser.CountSqlParser;
import org.jeecgframework.minidao.pojo.MiniDaoPage;
/**
@@ -8,8 +7,6 @@
*
*/
public abstract class AbstractDialect implements Dialect {
- //TODO 处理SQL
- protected CountSqlParser countSqlParser = new CountSqlParser();
/**
* 处理分页参数
diff --git a/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServer2012Dialect.java b/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServer2012Dialect.java
index 5dc362d..8404924 100644
--- a/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServer2012Dialect.java
+++ b/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServer2012Dialect.java
@@ -12,17 +12,16 @@ public class SqlServer2012Dialect extends SqlServerDialect {
@Override
public String getPageSql(String sql, MiniDaoPage miniDaoPage) {
StringBuilder sqlBuilder = new StringBuilder(sql.length() + 64);
- //update-begin--Author:wangshuai--Date:20211201--for:判断sqlserver是否包含offset或next,包含用select包裹起来,不包含直接拼接
- if(sql.toUpperCase().contains("OFFSET") && sql.toUpperCase().contains("NEXT")){
- sqlBuilder.append("SELECT * FROM (");
- sqlBuilder.append(sql);
- sqlBuilder.append(") TMP_PAGE ");
- sqlBuilder.append("\n OFFSET {0} ROWS FETCH NEXT {1} ROWS ONLY ");
- }else{
- sqlBuilder.append(sql);
- sqlBuilder.append("\n OFFSET {0} ROWS FETCH NEXT {1} ROWS ONLY ");
- }
- //update-end--Author:wangshuai--Date:20211201--for:判断sqlserver是否包含offset或next,包含用select包裹起来,不包含直接拼接
+
+ /**
+ * 在SQL Server中,使用OFFSET关键字来实现分页查询时,通常需要搭配ORDER BY子句来指定排序规则,因为OFFSET必须和ORDER BY一起使用。
+ * 如果不需要排序,可以使用ORDER BY (SELECT NULL)来实现类似无排序的效果。
+ */
+ sqlBuilder.append("SELECT * FROM (");
+ sqlBuilder.append(sql);
+ sqlBuilder.append(") TMP_PAGE ");
+ sqlBuilder.append(" ORDER BY (SELECT NULL) ");
+ sqlBuilder.append("\n OFFSET {0} ROWS FETCH NEXT {1} ROWS ONLY ");
String newSql = sqlBuilder.toString();
newSql = super.format(newSql, super.getPageParam(miniDaoPage));
return newSql;
diff --git a/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServerDialect.java b/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServerDialect.java
index 8bef5ea..8194d08 100644
--- a/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServerDialect.java
+++ b/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/dialect/helper/SqlServerDialect.java
@@ -1,24 +1,38 @@
package org.jeecgframework.minidao.pagehelper.dialect.helper;
+import org.jeecgframework.minidao.sqlparser.AbstractSqlProcessor;
import org.jeecgframework.minidao.pagehelper.dialect.AbstractHelperDialect;
-import org.jeecgframework.minidao.pagehelper.parser.SqlServerParser;
import org.jeecgframework.minidao.pojo.MiniDaoPage;
+import org.jeecgframework.minidao.sqlparser.impl.JsqlparserSqlProcessor;
+import org.jeecgframework.minidao.sqlparser.impl.SimpleSqlProcessor;
+import org.jeecgframework.minidao.util.MiniDaoUtil;
/**
* SqlServer
*/
public class SqlServerDialect extends AbstractHelperDialect {
- protected static SqlServerParser pageSql = new SqlServerParser();
+
+ //update-begin---author:scott ---date:2024-07-04 for:SQL解析引擎改造支持普通和jsqlparser切换----
+ protected static AbstractSqlProcessor abstractSqlProcessor;
+
+ static {
+ if (MiniDaoUtil.isJSqlParserAvailable()) {
+ abstractSqlProcessor = new JsqlparserSqlProcessor();
+ } else {
+ abstractSqlProcessor = new SimpleSqlProcessor();
+ }
+ }
+ //update-end---author:scott ---date:2024-07-04 for:SQL解析引擎改造支持普通和jsqlparser切换----
@Override
public String getPageSql(String sql, MiniDaoPage miniDaoPage) {
- int page = miniDaoPage.getPage();
- int rows = miniDaoPage.getRows();
- int beginNum = (page - 1) * rows;
- String cacheSql = sql;
- cacheSql = pageSql.convertToPageSql(cacheSql, null, null);
- cacheSql = cacheSql.replace(String.valueOf(Long.MIN_VALUE), String.valueOf(beginNum));
- cacheSql = cacheSql.replace(String.valueOf(Long.MAX_VALUE), String.valueOf(rows));
- return cacheSql;
+ String pageSql = null;
+ try {
+ pageSql = abstractSqlProcessor.getSqlServerPageSql(sql, miniDaoPage);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return pageSql;
}
+
}
diff --git a/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/parser/OrderByParser.java b/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/parser/OrderByParser.java
deleted file mode 100644
index 22d23f7..0000000
--- a/minidao-pe/src/main/java/org/jeecgframework/minidao/pagehelper/parser/OrderByParser.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.jeecgframework.minidao.pagehelper.parser;
-
-import net.sf.jsqlparser.parser.CCJSqlParserUtil;
-import net.sf.jsqlparser.statement.Statement;
-import net.sf.jsqlparser.statement.select.*;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.jeecgframework.minidao.pagehelper.PageException;
-
-import java.util.List;
-
-/**
- * 处理 Order by
- */
-public class OrderByParser {
- private static final Log log = LogFactory.getLog(OrderByParser.class);
-
- /**
- * convert to order by sql
- *
- * @param sql
- * @param orderBy
- * @return
- */
- public static String converToOrderBySql(String sql, String orderBy) {
- //解析SQL
- Statement stmt = null;
- try {
- stmt = CCJSqlParserUtil.parse(sql);
- Select select = (Select) stmt;
- SelectBody selectBody = select.getSelectBody();
- //处理body-去最外层order by
- List orderByElements = extraOrderBy(selectBody);
- String defaultOrderBy = PlainSelect.orderByToString(orderByElements);
- if (defaultOrderBy.indexOf('?') != -1) {
- throw new PageException("原SQL[" + sql + "]中的order by包含参数,因此不能使用OrderBy插件进行修改!");
- }
- //新的sql
- sql = select.toString();
- } catch (Throwable e) {
- log.warn("处理排序失败: " + e + ",降级为直接拼接 order by 参数");
- }
- return sql + " order by " + orderBy;
- }
-
- /**
- * extra order by and set default orderby to null
- *
- * @param selectBody
- */
- public static List extraOrderBy(SelectBody selectBody) {
- if (selectBody instanceof PlainSelect) {
- List orderByElements = ((PlainSelect) selectBody).getOrderByElements();
- ((PlainSelect) selectBody).setOrderByElements(null);
- return orderByElements;
- } else if (selectBody instanceof WithItem) {
- WithItem withItem = (WithItem) selectBody;
- if (withItem.getSubSelect().getSelectBody() != null) {
- return extraOrderBy(withItem.getSubSelect().getSelectBody());
- }
- } else {
- SetOperationList operationList = (SetOperationList) selectBody;
- if (operationList.getSelects() != null && operationList.getSelects().size() > 0) {
- List plainSelects = operationList.getSelects();
- return extraOrderBy(plainSelects.get(plainSelects.size() - 1));
- }
- }
- return null;
- }
-}
diff --git a/minidao-pe/src/main/java/org/jeecgframework/minidao/sqlparser/AbstractSqlProcessor.java b/minidao-pe/src/main/java/org/jeecgframework/minidao/sqlparser/AbstractSqlProcessor.java
new file mode 100644
index 0000000..6b21237
--- /dev/null
+++ b/minidao-pe/src/main/java/org/jeecgframework/minidao/sqlparser/AbstractSqlProcessor.java
@@ -0,0 +1,47 @@
+package org.jeecgframework.minidao.sqlparser;
+
+import org.jeecgframework.minidao.pojo.MiniDaoPage;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * SQL解析处理器(普通正则引擎 和 JSqlParser解析引擎)
+ *
+ * @author zhang
+ */
+public interface AbstractSqlProcessor {
+
+ /**
+ * 获取SqlServer分页SQL
+ *
+ * @param sql
+ * @return
+ */
+ String getSqlServerPageSql(String sql, MiniDaoPage miniDaoPage);
+
+ /**
+ * 获取SQL查询记录数SQL
+ *
+ * @param sql
+ * @return
+ */
+ String getCountSql(String sql);
+
+ /**
+ * 去除排序SQL片段
+ *
+ * @param sql
+ * @return
+ */
+ String removeOrderBy(String sql);
+
+
+ /**
+ * 解析SQL查询字段
+ *
+ * @param parsedSql
+ * @return
+ */
+ List
-
- com.mysql
- mysql-connector-j
- true
+
+ com.mysql
+ mysql-connector-j
+ true
runtime
-
+
com.alibaba
druid
diff --git a/pom.xml b/pom.xml
index 5448d6e..9ad00b9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
org.jeecgframework.boot3
minidao-parent
- 1.9.6
+ 1.10.1
pom