From c01c476ecbbeb84f3a9ba048597b990cf7650b00 Mon Sep 17 00:00:00 2001 From: macy0122 Date: Thu, 23 Jan 2025 04:55:06 +0000 Subject: [PATCH] =?UTF-8?q?!523=20FIX=20[Bug]:=20sqlserver2022=E4=B8=8B?= =?UTF-8?q?=E6=96=B9=E8=A8=80=E8=AF=86=E5=88=AB=E4=B8=8D=E5=AF=B9=EF=BC=8C?= =?UTF-8?q?=E6=89=8B=E5=8A=A8set=E4=B9=9F=E6=97=A0=E6=95=88=C2=A0=20https:?= =?UTF-8?q?//gitee.com/mybatis-flex/mybatis-flex/issues/IBIHW3=20Merge=20p?= =?UTF-8?q?ull=20request=20!523=20from=20macy0122/main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatisflex/core/dialect/DbTypeUtil.java | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/DbTypeUtil.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/DbTypeUtil.java index b5d34585..01e9ca82 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/DbTypeUtil.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/DbTypeUtil.java @@ -19,12 +19,13 @@ package com.mybatisflex.core.dialect; import com.mybatisflex.core.exception.FlexExceptions; import com.mybatisflex.core.exception.locale.LocalizedFormats; import com.mybatisflex.core.util.StringUtil; -import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; - -import javax.sql.DataSource; import java.lang.reflect.Method; import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.regex.Pattern; +import javax.sql.DataSource; +import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; /** * DbType 解析 工具类 @@ -39,14 +40,46 @@ public class DbTypeUtil { */ public static DbType getDbType(DataSource dataSource) { String jdbcUrl = getJdbcUrl(dataSource); - if (StringUtil.hasText(jdbcUrl)) { + //FIX [Bug]: sqlserver2022下方言识别不对,手动set也无效 https://gitee.com/mybatis-flex/mybatis-flex/issues/IBIHW3 + if (jdbcUrl.contains(":sqlserver:")) { + return getSqlserverDbType(dataSource); + } return parseDbType(jdbcUrl); } throw new IllegalStateException("Can not get dataSource jdbcUrl: " + dataSource.getClass().getName()); } + /** + * 通过数据源获取SQLserver 版本 + * + * @return DbType + */ + private static DbType getSqlserverDbType(DataSource dataSource) { + try (ResultSet resultSet = dataSource.getConnection().prepareStatement("SELECT @@VERSION").executeQuery()) { + //SELECT @@VERSION 查询返回信息: + /* + Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) + Sep 24 2019 13:48:23 + Copyright (C) 2019 Microsoft Corporation + Enterprise Edition (64-bit) on Windows Server 2019 Datacenter 10.0 (Build 17763: ) (Hypervisor) + */ + if (resultSet.next()) { + String version = resultSet.getString(1); + if (StringUtil.hasText(version)) { + String year = version.substring(21, 25); + if (StringUtil.hasText(year) && year.compareTo("2005") <= 0) { + return DbType.SQLSERVER_2005; + } + } + } + return DbType.SQLSERVER; + } catch (SQLException e) { + return DbType.SQLSERVER; + } + } + /** * 通过数据源中获取 jdbc 的 url 配置 * 符合 HikariCP, druid, c3p0, DBCP, beecp 数据源框架 以及 MyBatis UnpooledDataSource 的获取规则 @@ -89,10 +122,6 @@ public class DbTypeUtil { return DbType.MARIADB; } else if (jdbcUrl.contains(":oracle:")) { return DbType.ORACLE; - } else if (jdbcUrl.contains(":sqlserver2012:")) { - return DbType.SQLSERVER; - } else if (jdbcUrl.contains(":sqlserver:") || jdbcUrl.contains(":microsoft:")) { - return DbType.SQLSERVER_2005; } else if (jdbcUrl.contains(":postgresql:")) { return DbType.POSTGRE_SQL; } else if (jdbcUrl.contains(":hsqldb:")) { @@ -159,9 +188,9 @@ public class DbTypeUtil { return DbType.GREENPLUM; } else if (jdbcUrl.contains(":lealone:")) { return DbType.LEALONE; - } else if (jdbcUrl.contains(":hive2:")) { + } else if (jdbcUrl.contains(":hive2:")) { return DbType.HIVE; - } else if (jdbcUrl.contains(":duckdb:")) { + } else if (jdbcUrl.contains(":duckdb:")) { return DbType.DUCKDB; } else { return DbType.OTHER;