add DriverNamePool

This commit is contained in:
Looly 2021-04-11 02:53:16 +08:00
parent 3a105e0334
commit c7f7c4c1f9
6 changed files with 239 additions and 67 deletions

View File

@ -22,6 +22,8 @@
* 【extra 】 添加Houbb Pinyin支持pr#1506@Github
* 【core 】 添加LambdaUtilpr#295@Gitee
* 【core 】 添加StrPool和CharPool
* 【extra 】 CglibUtil增加toBean和fillBean方法
* 【db 】 增加DriverNamePool
### Bug修复
* 【core 】 修复Validator.isUrl()传空返回trueissue#I3ETTY@Gitee

View File

@ -4,14 +4,8 @@ import cn.hutool.core.collection.IterUtil;
import cn.hutool.core.comparator.CompareUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.io.FastByteArrayOutputStream;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.MapUtil;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.util.Collection;
@ -427,24 +421,8 @@ public class ObjectUtil {
* @return 克隆后的对象
* @throws UtilException IO异常和ClassNotFoundException封装
*/
@SuppressWarnings("unchecked")
public static <T> T cloneByStream(T obj) {
if (false == (obj instanceof Serializable)) {
return null;
}
final FastByteArrayOutputStream byteOut = new FastByteArrayOutputStream();
ObjectOutputStream out = null;
try {
out = new ObjectOutputStream(byteOut);
out.writeObject(obj);
out.flush();
final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteOut.toByteArray()));
return (T) in.readObject();
} catch (Exception e) {
throw new UtilException(e);
} finally {
IoUtil.close(out);
}
return SerializeUtil.clone(obj);
}
/**
@ -456,12 +434,7 @@ public class ObjectUtil {
* @return 序列化后的字节码
*/
public static <T> byte[] serialize(T obj) {
if (false == (obj instanceof Serializable)) {
return null;
}
final FastByteArrayOutputStream byteOut = new FastByteArrayOutputStream();
IoUtil.writeObjects(byteOut, false, (Serializable) obj);
return byteOut.toByteArray();
return SerializeUtil.serialize(obj);
}
/**
@ -477,7 +450,7 @@ public class ObjectUtil {
* @return 反序列化后的对象
*/
public static <T> T deserialize(byte[] bytes) {
return IoUtil.readObj(new ByteArrayInputStream(bytes));
return SerializeUtil.deserialize(bytes);
}
/**
@ -612,7 +585,7 @@ public class ObjectUtil {
* @param objs 被检查对象
* @return 是否存在
* @since 5.5.3
* @see ArrayUtil#hasNull(Object[])
* @see ArrayUtil#hasNull(Object[])
*/
public static boolean hasNull(Object... objs) {
return ArrayUtil.hasNull(objs);

View File

@ -0,0 +1,66 @@
package cn.hutool.core.util;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.io.FastByteArrayOutputStream;
import cn.hutool.core.io.IoUtil;
import java.io.ByteArrayInputStream;
import java.io.Serializable;
/**
* 序列化工具类
*
* @author looly
* @since 5.6.3
*/
public class SerializeUtil {
/**
* 序列化后拷贝流的方式克隆<br>
* 对象必须实现Serializable接口
*
* @param <T> 对象类型
* @param obj 被克隆对象
* @return 克隆后的对象
* @throws UtilException IO异常和ClassNotFoundException封装
*/
public static <T> T clone(T obj) {
if (false == (obj instanceof Serializable)) {
return null;
}
return deserialize(serialize(obj));
}
/**
* 序列化<br>
* 对象必须实现Serializable接口
*
* @param <T> 对象类型
* @param obj 要被序列化的对象
* @return 序列化后的字节码
*/
public static <T> byte[] serialize(T obj) {
if (false == (obj instanceof Serializable)) {
return null;
}
final FastByteArrayOutputStream byteOut = new FastByteArrayOutputStream();
IoUtil.writeObjects(byteOut, false, (Serializable) obj);
return byteOut.toByteArray();
}
/**
* 反序列化<br>
* 对象必须实现Serializable接口
*
* <p>
* 注意 此方法不会检查反序列化安全可能存在反序列化漏洞风险
* </p>
*
* @param <T> 对象类型
* @param bytes 反序列化的字节码
* @return 反序列化后的对象
*/
public static <T> T deserialize(byte[] bytes) {
return IoUtil.readObj(new ByteArrayInputStream(bytes));
}
}

View File

@ -23,40 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
* @author loolly
*
*/
public class DialectFactory {
/** JDBC 驱动 MySQL */
public static final String DRIVER_MYSQL = "com.mysql.jdbc.Driver";
/** JDBC 驱动 MySQL在6.X版本中变动驱动类名且使用SPI机制 */
public static final String DRIVER_MYSQL_V6 = "com.mysql.cj.jdbc.Driver";
/** JDBC 驱动 Oracle */
public static final String DRIVER_ORACLE = "oracle.jdbc.OracleDriver";
/** JDBC 驱动 Oracle旧版使用 */
public static final String DRIVER_ORACLE_OLD = "oracle.jdbc.driver.OracleDriver";
/** JDBC 驱动 PostgreSQL */
public static final String DRIVER_POSTGRESQL = "org.postgresql.Driver";
/** JDBC 驱动 SQLLite3 */
public static final String DRIVER_SQLLITE3 = "org.sqlite.JDBC";
/** JDBC 驱动 SQLServer */
public static final String DRIVER_SQLSERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
/** JDBC 驱动 Hive */
public static final String DRIVER_HIVE = "org.apache.hadoop.hive.jdbc.HiveDriver";
/** JDBC 驱动 Hive2 */
public static final String DRIVER_HIVE2 = "org.apache.hive.jdbc.HiveDriver";
/** JDBC 驱动 H2 */
public static final String DRIVER_H2 = "org.h2.Driver";
/** JDBC 驱动 Derby */
public static final String DRIVER_DERBY = "org.apache.derby.jdbc.AutoloadedDriver";
/** JDBC 驱动 HSQLDB */
public static final String DRIVER_HSQLDB = "org.hsqldb.jdbc.JDBCDriver";
/** JDBC 驱动 达梦7 */
public static final String DRIVER_DM7 = "dm.jdbc.driver.DmDriver";
/** JDBC 驱动 人大金仓 */
public static final String DRIVER_KINGBASE8 = "com.kingbase8.Driver";
/** JDBC 驱动 Ignite thin */
public static final String DRIVER_IGNITE_THIN = "org.apache.ignite.IgniteJdbcThinDriver";
/** JDBC 驱动 ClickHouse */
public static final String DRIVER_CLICK_HOUSE = "ru.yandex.clickhouse.ClickHouseDriver";
public class DialectFactory implements DriverNamePool{
private static final Map<DataSource, Dialect> DIALECT_POOL = new ConcurrentHashMap<>();
@ -123,7 +90,7 @@ public class DialectFactory {
}
String driver = null;
if (nameContainsProductInfo.contains("mysql")) {
if (nameContainsProductInfo.contains("mysql") || nameContainsProductInfo.contains("cobar")) {
driver = ClassLoaderUtil.isPresent(DRIVER_MYSQL_V6) ? DRIVER_MYSQL_V6 : DRIVER_MYSQL;
} else if (nameContainsProductInfo.contains("oracle")) {
driver = ClassLoaderUtil.isPresent(DRIVER_ORACLE) ? DRIVER_ORACLE : DRIVER_ORACLE_OLD;
@ -131,7 +98,7 @@ public class DialectFactory {
driver = DRIVER_POSTGRESQL;
} else if (nameContainsProductInfo.contains("sqlite")) {
driver = DRIVER_SQLLITE3;
} else if (nameContainsProductInfo.contains("sqlserver")) {
} else if (nameContainsProductInfo.contains("sqlserver") || nameContainsProductInfo.contains("microsoft")) {
driver = DRIVER_SQLSERVER;
} else if (nameContainsProductInfo.contains("hive")) {
driver = DRIVER_HIVE;
@ -155,6 +122,30 @@ public class DialectFactory {
} 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")) {
// 神州数据库
driver = DRIVER_SYBASE;
}
return driver;

View File

@ -0,0 +1,112 @@
package cn.hutool.db.dialect;
/**
* 常用数据库驱动池
*
* @author looly
* @since 5.6.3
*/
public interface DriverNamePool {
/**
* JDBC 驱动 MySQL
*/
String DRIVER_MYSQL = "com.mysql.jdbc.Driver";
/**
* JDBC 驱动 MySQL在6.X版本中变动驱动类名且使用SPI机制
*/
String DRIVER_MYSQL_V6 = "com.mysql.cj.jdbc.Driver";
/**
* JDBC 驱动 MariaDB
*/
String DRIVER_MARIADB = "org.mariadb.jdbc.Driver";
/**
* JDBC 驱动 Oracle
*/
String DRIVER_ORACLE = "oracle.jdbc.OracleDriver";
/**
* JDBC 驱动 Oracle旧版使用
*/
String DRIVER_ORACLE_OLD = "oracle.jdbc.driver.OracleDriver";
/**
* JDBC 驱动 PostgreSQL
*/
String DRIVER_POSTGRESQL = "org.postgresql.Driver";
/**
* JDBC 驱动 SQLLite3
*/
String DRIVER_SQLLITE3 = "org.sqlite.JDBC";
/**
* JDBC 驱动 SQLServer
*/
String DRIVER_SQLSERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
/**
* JDBC 驱动 Hive
*/
String DRIVER_HIVE = "org.apache.hadoop.hive.jdbc.HiveDriver";
/**
* JDBC 驱动 Hive2
*/
String DRIVER_HIVE2 = "org.apache.hive.jdbc.HiveDriver";
/**
* JDBC 驱动 H2
*/
String DRIVER_H2 = "org.h2.Driver";
/**
* JDBC 驱动 Derby
*/
String DRIVER_DERBY = "org.apache.derby.jdbc.AutoloadedDriver";
/**
* JDBC 驱动 HSQLDB
*/
String DRIVER_HSQLDB = "org.hsqldb.jdbc.JDBCDriver";
/**
* JDBC 驱动 达梦7
*/
String DRIVER_DM7 = "dm.jdbc.driver.DmDriver";
/**
* JDBC 驱动 人大金仓
*/
String DRIVER_KINGBASE8 = "com.kingbase8.Driver";
/**
* JDBC 驱动 Ignite thin
*/
String DRIVER_IGNITE_THIN = "org.apache.ignite.IgniteJdbcThinDriver";
/**
* JDBC 驱动 ClickHouse
*/
String DRIVER_CLICK_HOUSE = "ru.yandex.clickhouse.ClickHouseDriver";
/**
* JDBC 驱动 瀚高数据库
*/
String DRIVER_HIGHGO = "com.highgo.jdbc.Driver";
/**
* JDBC 驱动 DB2
*/
String DRIVER_DB2 = "com.ibm.db2.jdbc.app.DB2Driver";
/**
* JDBC 驱动 虚谷数据库
*/
String DRIVER_XUGU = "com.xugu.cloudjdbc.Driver";
/**
* JDBC 驱动 Apache Phoenix
*/
String DRIVER_PHOENIX = "org.apache.phoenix.jdbc.PhoenixDriver";
/**
* JDBC 驱动 华为高斯
*/
String DRIVER_GAUSS = "com.huawei.gauss.jdbc.ZenithDriver";
/**
* JDBC 驱动 南大通用
*/
String DRIVER_GBASE = "com.gbase.jdbc.Driver";
/**
* JDBC 驱动 神州数据库
*/
String DRIVER_OSCAR = "com.oscar.Driver";
/**
* JDBC 驱动 Sybase
*/
String DRIVER_SYBASE = "com.sybase.jdbc4.jdbc.SybDriver";
}

View File

@ -8,6 +8,7 @@ import net.sf.cglib.core.Converter;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@ -152,4 +153,31 @@ public class CglibUtil {
public static BeanMap toMap(Object bean) {
return BeanMap.create(bean);
}
/**
* 将Map中的内容填充至Bean中
* @param map Map
* @param bean Bean
* @param <T> Bean类型
* @return bean
* @since 5.6.3
*/
@SuppressWarnings("rawtypes")
public static <T> T fillBean(Map map, T bean){
BeanMap.create(bean).putAll(map);
return bean;
}
/**
* 将Map转换为Bean
* @param map Map
* @param beanClass Bean类
* @param <T> Bean类型
* @return bean
* @since 5.6.3
*/
@SuppressWarnings("rawtypes")
public static <T> T toBean(Map map, Class<T> beanClass){
return fillBean(map, ReflectUtil.newInstanceIfPossible(beanClass));
}
}