diff --git a/CHANGELOG.md b/CHANGELOG.md index 08e48423e..be78e0b23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ * 【extra 】 添加Houbb Pinyin支持(pr#1506@Github) * 【core 】 添加LambdaUtil(pr#295@Gitee) * 【core 】 添加StrPool和CharPool +* 【extra 】 CglibUtil增加toBean和fillBean方法 +* 【db 】 增加DriverNamePool ### Bug修复 * 【core 】 修复Validator.isUrl()传空返回true(issue#I3ETTY@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java index 9cb0a0f44..9f68a82fc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java @@ -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 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 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 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); diff --git a/hutool-core/src/main/java/cn/hutool/core/util/SerializeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/SerializeUtil.java new file mode 100644 index 000000000..35872cac9 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/util/SerializeUtil.java @@ -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 { + + /** + * 序列化后拷贝流的方式克隆
+ * 对象必须实现Serializable接口 + * + * @param 对象类型 + * @param obj 被克隆对象 + * @return 克隆后的对象 + * @throws UtilException IO异常和ClassNotFoundException封装 + */ + public static T clone(T obj) { + if (false == (obj instanceof Serializable)) { + return null; + } + return deserialize(serialize(obj)); + } + + /** + * 序列化
+ * 对象必须实现Serializable接口 + * + * @param 对象类型 + * @param obj 要被序列化的对象 + * @return 序列化后的字节码 + */ + public static 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(); + } + + /** + * 反序列化
+ * 对象必须实现Serializable接口 + * + *

+ * 注意!!! 此方法不会检查反序列化安全,可能存在反序列化漏洞风险!!! + *

+ * + * @param 对象类型 + * @param bytes 反序列化的字节码 + * @return 反序列化后的对象 + */ + public static T deserialize(byte[] bytes) { + return IoUtil.readObj(new ByteArrayInputStream(bytes)); + } +} diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java index 78e35fa2a..115ac68cf 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java @@ -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 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; diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/DriverNamePool.java b/hutool-db/src/main/java/cn/hutool/db/dialect/DriverNamePool.java new file mode 100644 index 000000000..6da118859 --- /dev/null +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/DriverNamePool.java @@ -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"; + +} diff --git a/hutool-extra/src/main/java/cn/hutool/extra/cglib/CglibUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/cglib/CglibUtil.java index 348272d43..e90d395a8 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/cglib/CglibUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/cglib/CglibUtil.java @@ -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 Bean类型 + * @return bean + * @since 5.6.3 + */ + @SuppressWarnings("rawtypes") + public static T fillBean(Map map, T bean){ + BeanMap.create(bean).putAll(map); + return bean; + } + + /** + * 将Map转换为Bean + * @param map Map + * @param beanClass Bean类 + * @param Bean类型 + * @return bean + * @since 5.6.3 + */ + @SuppressWarnings("rawtypes") + public static T toBean(Map map, Class beanClass){ + return fillBean(map, ReflectUtil.newInstanceIfPossible(beanClass)); + } }