add DriverIdentifier

This commit is contained in:
Looly 2023-12-04 23:27:42 +08:00
parent df227d63aa
commit 301968cbbc
17 changed files with 469 additions and 190 deletions

View File

@ -3201,7 +3201,9 @@ public class CharSequenceUtil extends StrValidator {
}
/**
* 截断字符串使用其按照指定编码为字节后不超过maxBytes长度
* 截断字符串使用其按照指定编码为字节后不超过maxBytes长度<br>
* 此方法用于截取总bytes数不超过指定长度如果字符出没有超出原样输出如果超出了则截取掉超出部分并可选添加...
* 但是添加...后总长度也不超过限制长度
*
* @param str 原始字符串
* @param charset 指定编码

View File

@ -321,6 +321,13 @@ public class CharSequenceUtilTest {
Assertions.assertEquals(str, ret);
}
@Test
public void limitByteLengthUtf8Test2() {
final String str = "这是This一";
final String ret = StrUtil.limitByteLengthUtf8(str, 12, true);
Assertions.assertEquals("这是Thi...", ret);
}
@Test
public void limitByteLengthTest() {
final String str = "This is English";

View File

@ -12,10 +12,9 @@
package org.dromara.hutool.db.dialect;
import org.dromara.hutool.core.classloader.ClassLoaderUtil;
import org.dromara.hutool.core.map.SafeConcurrentHashMap;
import org.dromara.hutool.core.regex.ReUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.db.driver.DriverUtil;
import org.dromara.hutool.db.dialect.impl.AnsiSqlDialect;
import org.dromara.hutool.db.dialect.impl.H2Dialect;
import org.dromara.hutool.db.dialect.impl.MysqlDialect;
@ -84,106 +83,6 @@ public class DialectFactory implements DriverNamePool {
return new AnsiSqlDialect();
}
/**
* 通过JDBC URL等信息识别JDBC驱动名
*
* @param nameContainsProductInfo 包含数据库标识的字符串
* @return 驱动
*/
public static String identifyDriver(final String nameContainsProductInfo) {
return identifyDriver(nameContainsProductInfo, null);
}
/**
* 通过JDBC URL等信息识别JDBC驱动名
*
* @param nameContainsProductInfo 包含数据库标识的字符串
* @param classLoader 类加载器{@code null}表示默认上下文的类加载器
* @return 驱动
*/
public static String identifyDriver(String nameContainsProductInfo, final ClassLoader classLoader) {
if (StrUtil.isBlank(nameContainsProductInfo)) {
return null;
}
// 全部转为小写忽略大小写
nameContainsProductInfo = StrUtil.cleanBlank(nameContainsProductInfo.toLowerCase());
// 首先判断是否为标准的JDBC URL截取jdbc:xxxx:中间部分
final String name = ReUtil.getGroup1("jdbc:(.*?):", nameContainsProductInfo);
if (StrUtil.isNotBlank(name)) {
nameContainsProductInfo = name;
}
String driver = null;
if (nameContainsProductInfo.contains("mysql") || nameContainsProductInfo.contains("cobar")) {
driver = ClassLoaderUtil.isPresent(DRIVER_MYSQL_V6, classLoader) ? DRIVER_MYSQL_V6 : DRIVER_MYSQL;
} else if (nameContainsProductInfo.contains("mariadb")) {
// Mariadb
driver = DRIVER_MARIADB;
} else if (nameContainsProductInfo.contains("oracle")) {
driver = ClassLoaderUtil.isPresent(DRIVER_ORACLE, classLoader) ? DRIVER_ORACLE : DRIVER_ORACLE_OLD;
} else if (nameContainsProductInfo.contains("postgresql")) {
driver = DRIVER_POSTGRESQL;
} else if (nameContainsProductInfo.contains("sqlite")) {
driver = DRIVER_SQLLITE3;
} else if (nameContainsProductInfo.contains("sqlserver") || nameContainsProductInfo.contains("microsoft")) {
driver = DRIVER_SQLSERVER;
} else if (nameContainsProductInfo.contains("hive2")) {
driver = DRIVER_HIVE2;
} else if (nameContainsProductInfo.contains("hive")) {
driver = DRIVER_HIVE;
} else if (nameContainsProductInfo.contains("h2")) {
driver = DRIVER_H2;
} else if (nameContainsProductInfo.contains("derby")) {
// 嵌入式Derby数据库
driver = DRIVER_DERBY;
} else if (nameContainsProductInfo.contains("hsqldb")) {
// HSQLDB
driver = DRIVER_HSQLDB;
} else if (nameContainsProductInfo.contains("dm")) {
// 达梦7
driver = DRIVER_DM7;
} else if (nameContainsProductInfo.contains("kingbase8")) {
// 人大金仓8
driver = DRIVER_KINGBASE8;
} else if (nameContainsProductInfo.contains("ignite")) {
// Ignite thin
driver = DRIVER_IGNITE_THIN;
} else if (nameContainsProductInfo.contains("clickhouse")) {
// ClickHouse
driver = DRIVER_CLICK_HOUSE;
} else if (nameContainsProductInfo.contains("highgo")) {
// 瀚高
driver = DRIVER_HIGHGO;
} else if (nameContainsProductInfo.contains("db2")) {
// DB2
driver = DRIVER_DB2;
} else if (nameContainsProductInfo.contains("xugu")) {
// 虚谷
driver = DRIVER_XUGU;
} else if (nameContainsProductInfo.contains("phoenix")) {
// Apache Phoenix
driver = DRIVER_PHOENIX;
} else if (nameContainsProductInfo.contains("zenith")) {
// 华为高斯
driver = DRIVER_GAUSS;
} else if (nameContainsProductInfo.contains("gbase")) {
// 南大通用数据库
driver = DRIVER_GBASE;
} else if (nameContainsProductInfo.contains("oscar")) {
// 神州数据库
driver = DRIVER_OSCAR;
} else if (nameContainsProductInfo.contains("sybase")) {
// Sybase
driver = DRIVER_SYBASE;
} else if (nameContainsProductInfo.contains("opengauss")) {
// OpenGauss
driver = DRIVER_OPENGAUSS;
}
return driver;
}
/**
* 获取共享方言
*

View File

@ -0,0 +1,164 @@
/*
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.driver;
import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.db.driver.matcher.Db2DriverMatcher;
import org.dromara.hutool.db.driver.matcher.DriverMatcher;
import org.dromara.hutool.db.driver.matcher.MysqlDriverMatcher;
import org.dromara.hutool.db.driver.matcher.StartsWithDriverMatcher;
import java.util.List;
/**
* 驱动识别器<br>
* 通过给定的规则列表逐个查找直到匹配到{@link DriverMatcher}获取其驱动名<br>
* 部分驱动参考Druid实现
*
* @author looly
* @since 6.0.0
*/
public class DriverIdentifier {
/**
* 单例驱动识别器
*/
public static DriverIdentifier INSTANCE = new DriverIdentifier(null);
private final List<DriverMatcher> matcherList;
/**
* 构造
*
* @param classLoader 类加载器
*/
public DriverIdentifier(final ClassLoader classLoader) {
this.matcherList = ListUtil.of(
// Mysql
new MysqlDriverMatcher(classLoader),
// Mariadb
new StartsWithDriverMatcher("org.mariadb.jdbc.Driver", "jdbc:mariadb:"),
// Oracle
new StartsWithDriverMatcher("oracle.jdbc.OracleDriver", "jdbc:oracle:", "JDBC:oracle:"),
new StartsWithDriverMatcher("com.alibaba.jdbc.AlibabaDriver", "jdbc:alibaba:oracle:"),
// PostgreSQL
new StartsWithDriverMatcher("org.postgresql.Driver", "jdbc:postgresql:"),
// SQLServer
new StartsWithDriverMatcher("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver:"),
new StartsWithDriverMatcher("com.microsoft.jdbc.sqlserver.SQLServerDriver", "jdbc:microsoft:"),
// SQLite3
new StartsWithDriverMatcher("org.sqlite.JDBC", "jdbc:sqlite:"),
// H2
new StartsWithDriverMatcher("org.h2.Driver", "jdbc:h2:"),
// Hive
new StartsWithDriverMatcher("org.apache.hadoop.hive.jdbc.HiveDriver", "jdbc:hive:"),
new StartsWithDriverMatcher("org.apache.hive.jdbc.HiveDriver", "jdbc:hive2:"),
// Apache Derby
new StartsWithDriverMatcher("org.apache.derby.jdbc.EmbeddedDriver", "jdbc:derby:"),
// log4jdbc
new StartsWithDriverMatcher("net.sf.log4jdbc.DriverSpy", "jdbc:log4jdbc:"),
// tidb
new StartsWithDriverMatcher("io.tidb.bigdata.jdbc.TiDBDriver", "jdbc:tidb:"),
// oceanbase
new StartsWithDriverMatcher("com.oceanbase.jdbc.Driver", "jdbc:oceanbase:"),
// SyBase JConnecthttps://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc39001.0700/html/prjdbc0700/X28208.htm
new StartsWithDriverMatcher("com.sybase.jdbc4.jdbc.SybDriver", "jdbc:sybase:Tds:"),
new StartsWithDriverMatcher("net.sourceforge.jtds.jdbc.Driver", "jdbc:jtds:"),
new StartsWithDriverMatcher("com.alibaba.druid.mock.MockDriver", "jdbc:fake:", "jdbc:mock:"),
new StartsWithDriverMatcher("com.edb.Driver", "jdbc:edb:"),
new StartsWithDriverMatcher("com.aliyun.odps.jdbc.OdpsDriver", "jdbc:odps:"),
// HSQLDB
new StartsWithDriverMatcher("org.hsqldb.jdbcDriver", "jdbc:hsqldb:"),
new Db2DriverMatcher(),
new StartsWithDriverMatcher("com.ingres.jdbc.IngresDriver", "jdbc:ingres:"),
new StartsWithDriverMatcher("com.mckoi.JDBCDriver", "jdbc:mckoi:"),
new StartsWithDriverMatcher("COM.cloudscape.core.JDBCDriver", "jdbc:cloudscape:"),
new StartsWithDriverMatcher("com.informix.jdbc.IfxDriver", "jdbc:informix-sqli:"),
new StartsWithDriverMatcher("com.timesten.jdbc.TimesTenDriver", "jdbc:timesten:"),
new StartsWithDriverMatcher("com.ibm.as400.access.AS400JDBCDriver", "jdbc:as400:"),
new StartsWithDriverMatcher("com.attunity.jdbc.NvDriver", "jdbc:attconnect:"),
new StartsWithDriverMatcher("com.jnetdirect.jsql.JSQLDriver", "jdbc:JSQLConnect:"),
new StartsWithDriverMatcher("com.newatlanta.jturbo.driver.Driver", "jdbc:JTurbo:"),
new StartsWithDriverMatcher("interbase.interclient.Driver", "jdbc:interbase:"),
new StartsWithDriverMatcher("com.pointbase.jdbc.jdbcUniversalDriver", "jdbc:pointbase:"),
new StartsWithDriverMatcher("ca.edbc.jdbc.EdbcDriver", "jdbc:edbc:"),
new StartsWithDriverMatcher("com.mimer.jdbc.Driver", "jdbc:mimer:multi1:"),
// Apache Ignite
new StartsWithDriverMatcher("org.apache.ignite.IgniteJdbcThinDriver", "jdbc:ignite:thin:"),
// 达梦7
new StartsWithDriverMatcher("dm.jdbc.driver.DmDriver", "jdbc:dm:"),
// 人大金仓
new StartsWithDriverMatcher("com.kingbase.Driver", "jdbc:kingbase:"),
// 人大金仓8
new StartsWithDriverMatcher("com.kingbase8.Driver", "jdbc:kingbase8:"),
// 南大通用
new StartsWithDriverMatcher("com.gbase.jdbc.Driver", "jdbc:gbase:"),
// 虚谷
new StartsWithDriverMatcher("com.xugu.cloudjdbc.Driver", "jdbc:xugu:"),
// 神通
new StartsWithDriverMatcher("com.oscar.Driver", "jdbc:oscar:"),
// Apache Phoenix轻客户端
new StartsWithDriverMatcher("org.apache.phoenix.queryserver.client.Driver", "jdbc:phoenix:thin:"),
// Apache Phoenix重客户端在轻客户端后检测
new StartsWithDriverMatcher("org.apache.phoenix.jdbc.PhoenixDriver", "jdbc:phoenix:"),
new StartsWithDriverMatcher("org.apache.kylin.jdbc.Driver", "jdbc:kylin:"),
new StartsWithDriverMatcher("com.alibaba.xdriver.elastic.jdbc.ElasticDriver", "jdbc:elastic:"),
new StartsWithDriverMatcher("com.clickhouse.jdbc.ClickHouseDriver", "jdbc:clickhouse:"),
new StartsWithDriverMatcher("com.facebook.presto.jdbc.PrestoDriver", "jdbc:presto:"),
new StartsWithDriverMatcher("io.trino.jdbc.TrinoDriver", "jdbc:trino:"),
// 浪潮K-DB
new StartsWithDriverMatcher("com.inspur.jdbc.KdDriver", "jdbc:inspur:"),
new StartsWithDriverMatcher("com.aliyun.polardb.Driver", "jdbc:polardb"),
// 瀚高
new StartsWithDriverMatcher("com.highgo.jdbc.Driver", "jdbc:highgo:"),
new StartsWithDriverMatcher("com.pivotal.jdbc.GreenplumDriver", "jdbc:pivotal:greenplum:"),
// 华为OpenGauss
new StartsWithDriverMatcher("com.huawei.gauss.jdbc.ZenithDriver", "jdbc:zenith:"),
new StartsWithDriverMatcher("org.opengauss.Driver", "jdbc:opengauss:")
);
}
/**
* 通过JDBC URL等信息识别JDBC驱动名
*
* @param jdbcUrl JDBC URL
* @return 驱动类名未识别到返回{@code null}
*/
public String identifyDriver(final String jdbcUrl) {
if (StrUtil.isBlank(jdbcUrl)) {
return null;
}
for (final DriverMatcher driverMatcher : this.matcherList) {
if (driverMatcher.isMatch(jdbcUrl)) {
return driverMatcher.getClassName();
}
}
return null;
}
/**
* 自定义增加{@link DriverMatcher}
*
* @param matcher {@link DriverMatcher}
* @return this
*/
public DriverIdentifier addMatcher(final DriverMatcher matcher) {
if (null != matcher) {
this.matcherList.add(matcher);
}
return this;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
@ -10,7 +10,7 @@
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.dialect;
package org.dromara.hutool.db.driver;
import org.dromara.hutool.core.io.IoUtil;
import org.dromara.hutool.core.text.StrUtil;
@ -34,10 +34,10 @@ public class DriverUtil {
*
* @param nameContainsProductInfo 包含数据库标识的字符串
* @return 驱动
* @see DialectFactory#identifyDriver(String)
* @see DriverIdentifier#identifyDriver(String)
*/
public static String identifyDriver(final String nameContainsProductInfo) {
return DialectFactory.identifyDriver(nameContainsProductInfo);
return DriverIdentifier.INSTANCE.identifyDriver(nameContainsProductInfo);
}
/**
@ -47,9 +47,9 @@ public class DriverUtil {
* @return 驱动
*/
public static String identifyDriver(final DataSource ds) {
if(ds instanceof DSWrapper) {
final String driver = ((DSWrapper)ds).getDriver();
if(StrUtil.isNotBlank(driver)) {
if (ds instanceof DSWrapper) {
final String driver = ((DSWrapper) ds).getDriver();
if (StrUtil.isNotBlank(driver)) {
return driver;
}
}

View File

@ -0,0 +1,54 @@
/*
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.driver.matcher;
import org.dromara.hutool.core.text.StrUtil;
/**
* db2驱动匹配器来自Druid的JdbcUtils
*
* @author druid
*/
public class Db2DriverMatcher implements DriverMatcher {
private static final String DB2_DRIVER = "com.ibm.db2.jcc.DB2Driver"; // Type4
private static final String DB2_DRIVER2 = "COM.ibm.db2.jdbc.app.DB2Driver"; // Type2
private static final String DB2_DRIVER3 = "COM.ibm.db2.jdbc.net.DB2Driver"; // Type3
private String jdbcUrl;
@Override
public boolean isMatch(final String jdbcUrl) {
this.jdbcUrl = jdbcUrl;
return jdbcUrl.startsWith("jdbc:db2:");
}
@Override
public String getClassName() {
// 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
final String jdbcUrl = this.jdbcUrl;
final String prefix = "jdbc:db2:";
if (StrUtil.isEmpty(jdbcUrl) || jdbcUrl.startsWith(prefix + "//")) { // Type4
return DB2_DRIVER; // "com.ibm.db2.jcc.DB2Driver";
} else {
final String suffix = jdbcUrl.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
}
}
}
}

View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.driver.matcher;
/**
* 驱动匹配接口通过实现此接口可以<br>
* 通过{@link #isMatch(String)} 判断JDBC URL 是否匹配驱动的要求<br>
* 通过{@link #getClassName()} 获取对应的驱动类名称
*
* @author looly
*/
public interface DriverMatcher {
/**
* 自定义规则是否匹配 JDBC URL
*
* @param jdbcUrl JDBC URL
* @return 是否匹配
*/
boolean isMatch(final String jdbcUrl);
/**
* 获取对应的驱动类名称
*
* @return 对应的驱动类名称
*/
String getClassName();
}

View File

@ -0,0 +1,53 @@
/*
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.driver.matcher;
import org.dromara.hutool.core.classloader.ClassLoaderUtil;
/**
* Mysql匹配器
*
* @author looly
*/
public class MysqlDriverMatcher implements DriverMatcher {
private final ClassLoader classLoader;
private Boolean isVersion6;
/**
* 构造
*
* @param classLoader 类加载器
*/
public MysqlDriverMatcher(final ClassLoader classLoader) {
this.classLoader = classLoader;
}
@Override
public boolean isMatch(final String jdbcUrl) {
return jdbcUrl.startsWith("jdbc:mysql:")
// 阿里的Mysql分布式集群
|| jdbcUrl.startsWith("jdbc:cobar:")
// log4jdbc for Mysql
|| jdbcUrl.startsWith("jdbc:log4jdbc:mysql:");
}
@Override
public String getClassName() {
final String driverNameV6 = "com.mysql.cj.jdbc.Driver";
if (isVersion6 == null) {
isVersion6 = ClassLoaderUtil.isPresent(driverNameV6, classLoader);
}
return isVersion6 ? driverNameV6 : "com.mysql.jdbc.Driver";
}
}

View File

@ -0,0 +1,51 @@
/*
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.driver.matcher;
/**
* 判断jdbc url的起始字符串匹配对应的驱动类名
*
* @author looly
* @since 6.0.0
*/
public class StartsWithDriverMatcher implements DriverMatcher {
private final String className;
private final String[] startsWithStrs;
/**
* 构造
*
* @param className 驱动类名
* @param startsWithStrs 开头字符串标记列表或关系
*/
public StartsWithDriverMatcher(final String className, final String... startsWithStrs) {
this.className = className;
this.startsWithStrs = startsWithStrs;
}
@Override
public boolean isMatch(final String jdbcUrl) {
for (final String startsWithStr : startsWithStrs) {
if (jdbcUrl.startsWith(startsWithStr)) {
return true;
}
}
return false;
}
@Override
public String getClassName() {
return className;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
@ -10,17 +10,9 @@
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.dialect;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class DriverUtilTest {
@Test
public void identifyDriverTest(){
final String url = "jdbc:h2:file:./db/test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL";
final String driver = DriverUtil.identifyDriver(url); // driver 返回 mysql driver
Assertions.assertEquals("org.h2.Driver", driver);
}
}
/**
* 驱动匹配器封装及基本实现
*
* @author looly
*/
package org.dromara.hutool.db.driver.matcher;

View File

@ -0,0 +1,16 @@
/*
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
/**
* 驱动和驱动类名称相关封装
*/
package org.dromara.hutool.db.driver;

View File

@ -19,7 +19,7 @@ import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.db.DbRuntimeException;
import org.dromara.hutool.db.DbUtil;
import org.dromara.hutool.db.GlobalDbConfig;
import org.dromara.hutool.db.dialect.DriverUtil;
import org.dromara.hutool.db.driver.DriverUtil;
import org.dromara.hutool.setting.Setting;
import javax.sql.DataSource;

View File

@ -13,7 +13,7 @@
package org.dromara.hutool.db.ds.pooled;
import org.dromara.hutool.db.DbRuntimeException;
import org.dromara.hutool.db.dialect.DriverUtil;
import org.dromara.hutool.db.driver.DriverUtil;
import java.util.Properties;

View File

@ -15,7 +15,7 @@ package org.dromara.hutool.db.ds.pooled;
import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.db.DbRuntimeException;
import org.dromara.hutool.db.dialect.DriverUtil;
import org.dromara.hutool.db.driver.DriverUtil;
import org.dromara.hutool.db.ds.DSKeys;
import org.dromara.hutool.setting.Setting;

View File

@ -15,7 +15,7 @@ package org.dromara.hutool.db.ds.simple;
import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.db.DbRuntimeException;
import org.dromara.hutool.db.dialect.DriverUtil;
import org.dromara.hutool.db.driver.DriverUtil;
import org.dromara.hutool.db.ds.DSKeys;
import org.dromara.hutool.setting.Setting;
import org.dromara.hutool.setting.props.Props;

View File

@ -1,61 +0,0 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.dialect;
import org.dromara.hutool.core.util.RandomUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
import static org.dromara.hutool.db.dialect.DriverNamePool.*;
public class DialectFactoryTest {
@Test
public void identifyDriverTest(){
final Map<String,String> map = new HashMap<>(25);
map.put("mysql",DRIVER_MYSQL_V6);
map.put("cobar",DRIVER_MYSQL_V6);
map.put("oracle",DRIVER_ORACLE);
map.put("postgresql",DRIVER_POSTGRESQL);
map.put("sqlite",DRIVER_SQLLITE3);
map.put("sqlserver",DRIVER_SQLSERVER);
map.put("microsoft",DRIVER_SQLSERVER);
map.put("h2",DRIVER_H2);
map.put("derby",DRIVER_DERBY);
map.put("hsqldb",DRIVER_HSQLDB);
map.put("dm",DRIVER_DM7);
map.put("kingbase8",DRIVER_KINGBASE8);
map.put("ignite",DRIVER_IGNITE_THIN);
map.put("clickhouse",DRIVER_CLICK_HOUSE);
map.put("highgo",DRIVER_HIGHGO);
map.put("db2",DRIVER_DB2);
map.put("xugu",DRIVER_XUGU);
map.put("phoenix",DRIVER_PHOENIX);
map.put("zenith",DRIVER_GAUSS);
map.put("gbase",DRIVER_GBASE);
map.put("oscar",DRIVER_OSCAR);
map.put("sybase",DRIVER_SYBASE);
map.put("mariadb",DRIVER_MARIADB);
// 单元测试歧义
//map.put("hive2",DRIVER_HIVE2);
//map.put("hive",DRIVER_HIVE);
map.forEach((k,v) -> Assertions.assertEquals(v,
DialectFactory.identifyDriver(k+ RandomUtil.randomStringLower(2),null) ));
}
}

View File

@ -0,0 +1,64 @@
/*
* Copyright (c) 2023. looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* https://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.db.driver;
import org.dromara.hutool.core.util.RandomUtil;
import org.dromara.hutool.db.driver.DriverUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
public class DriverUtilTest {
@Test
public void identifyH2DriverTest(){
final String url = "jdbc:h2:file:./db/test;AUTO_SERVER=TRUE;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL";
final String driver = DriverUtil.identifyDriver(url); // driver 返回 mysql driver
Assertions.assertEquals("org.h2.Driver", driver);
}
@Test
public void identifyDriverTest() {
final Map<String, String> map = new HashMap<>(25);
map.put("jdbc:mysql:", "com.mysql.cj.jdbc.Driver");
map.put("jdbc:cobar:", "com.mysql.cj.jdbc.Driver");
map.put("jdbc:oracle:", "oracle.jdbc.OracleDriver");
map.put("jdbc:postgresql:", "org.postgresql.Driver");
map.put("jdbc:sqlite:", "org.sqlite.JDBC");
map.put("jdbc:sqlserver:", "com.microsoft.sqlserver.jdbc.SQLServerDriver");
map.put("jdbc:microsoft:", "com.microsoft.jdbc.sqlserver.SQLServerDriver");
map.put("jdbc:h2:", "org.h2.Driver");
map.put("jdbc:derby:", "org.apache.derby.jdbc.EmbeddedDriver");
map.put("jdbc:hsqldb:", "org.hsqldb.jdbcDriver");
map.put("jdbc:dm:", "dm.jdbc.driver.DmDriver");
map.put("jdbc:kingbase8:", "com.kingbase8.Driver");
map.put("jdbc:ignite:thin:", "org.apache.ignite.IgniteJdbcThinDriver");
map.put("jdbc:clickhouse:", "com.clickhouse.jdbc.ClickHouseDriver");
map.put("jdbc:highgo:", "com.highgo.jdbc.Driver");
map.put("jdbc:db2:", "COM.ibm.db2.jdbc.app.DB2Driver");
map.put("jdbc:xugu:", "com.xugu.cloudjdbc.Driver");
map.put("jdbc:phoenix:", "org.apache.phoenix.jdbc.PhoenixDriver");
map.put("jdbc:zenith:", "com.huawei.gauss.jdbc.ZenithDriver");
map.put("jdbc:gbase:", "com.gbase.jdbc.Driver");
map.put("jdbc:oscar:", "com.oscar.Driver");
map.put("jdbc:sybase:Tds:", "com.sybase.jdbc4.jdbc.SybDriver");
map.put("jdbc:mariadb:", "org.mariadb.jdbc.Driver");
map.put("jdbc:hive2:", "org.apache.hive.jdbc.HiveDriver");
map.put("jdbc:hive:", "org.apache.hadoop.hive.jdbc.HiveDriver");
map.forEach((k, v) -> Assertions.assertEquals(v,
DriverUtil.identifyDriver(k + RandomUtil.randomStringLower(2))));
}
}