From b737c979470abc9518b00216ab6f9cb9e2dc431c Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 1 Nov 2019 10:23:25 +0800 Subject: [PATCH] fix meta bug --- CHANGELOG.md | 2 + .../main/java/cn/hutool/core/map/MapUtil.java | 18 +++ .../main/java/cn/hutool/db/meta/MetaUtil.java | 125 +++++++++--------- .../java/cn/hutool/db/sql/SqlExecutor.java | 4 +- 4 files changed, 88 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e626a8f80..6dd954538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,10 @@ ## 5.0.5 ### 新特性 +* 【core】 增加MapUtil.removeAny(issue#612@Github) ### Bug修复 +* 【db】 修复MetaUtil.getTableMeta()方法未释放ResultSet的bug(issue#I148GH@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java index fd9fb86db..c849b08db 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java @@ -818,6 +818,24 @@ public class MapUtil { return filter(map, (Filter>) entry -> ArrayUtil.contains(keys, entry.getKey())); } + /** + * 去掉Map中指定key的键值对,修改原Map + * + * @param Key类型 + * @param Value类型 + * @param map Map + * @param keys 键列表 + * @return 修改后的key + * @since 5.0.5 + */ + @SuppressWarnings("unchecked") + public static Map removeAny(Map map, final K... keys) { + for (K key : keys) { + map.remove(key); + } + return map; + } + /** * 获取Map指定key的值,并转换为字符串 * diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java index 4d0f0d762..43d50aaef 100644 --- a/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/MetaUtil.java @@ -1,5 +1,12 @@ package cn.hutool.db.meta; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.db.DbRuntimeException; +import cn.hutool.db.DbUtil; +import cn.hutool.db.Entity; + +import javax.sql.DataSource; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; @@ -8,24 +15,15 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import javax.sql.DataSource; - -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.StrUtil; -import cn.hutool.db.DbRuntimeException; -import cn.hutool.db.DbUtil; -import cn.hutool.db.Entity; - /** * 数据库元数据信息工具类 - * - * @author looly * + * @author looly */ public class MetaUtil { /** * 获得所有表名 - * + * * @param ds 数据源 * @return 表名列表 */ @@ -35,8 +33,8 @@ public class MetaUtil { /** * 获得所有表名 - * - * @param ds 数据源 + * + * @param ds 数据源 * @param types 表类型 * @return 表名列表 */ @@ -46,10 +44,10 @@ public class MetaUtil { /** * 获得所有表名 - * - * @param ds 数据源 + * + * @param ds 数据源 * @param schema 表数据库名,对于Oracle为用户名 - * @param types 表类型 + * @param types 表类型 * @return 表名列表 * @since 3.3.1 */ @@ -59,50 +57,49 @@ public class MetaUtil { /** * 获得所有表名 - * - * @param ds 数据源 - * @param schema 表数据库名,对于Oracle为用户名 + * + * @param ds 数据源 + * @param schema 表数据库名,对于Oracle为用户名 * @param tableName 表名 - * @param types 表类型 + * @param types 表类型 * @return 表名列表 * @since 3.3.1 */ public static List getTables(DataSource ds, String schema, String tableName, TableType... types) { - final List tables = new ArrayList(); + final List tables = new ArrayList<>(); Connection conn = null; - ResultSet rs = null; try { conn = ds.getConnection(); // catalog和schema获取失败默认使用null代替 String catalog = getCataLog(conn); - if(null == schema) { + if (null == schema) { schema = getSchema(conn); } final DatabaseMetaData metaData = conn.getMetaData(); - rs = metaData.getTables(catalog, schema, tableName, Convert.toStrArray(types)); - if (rs == null) { - return null; - } - String table; - while (rs.next()) { - table = rs.getString("TABLE_NAME"); - if (StrUtil.isNotBlank(table)) { - tables.add(table); + try (ResultSet rs = metaData.getTables(catalog, schema, tableName, Convert.toStrArray(types))) { + if (null != rs) { + String table; + while (rs.next()) { + table = rs.getString("TABLE_NAME"); + if (StrUtil.isNotBlank(table)) { + tables.add(table); + } + } } } } catch (Exception e) { throw new DbRuntimeException("Get tables error!", e); } finally { - DbUtil.close(rs, conn); + DbUtil.close(conn); } return tables; } /** * 获得结果集的所有列名 - * + * * @param rs 结果集 * @return 列名数组 * @throws DbRuntimeException SQL执行异常 @@ -123,16 +120,15 @@ public class MetaUtil { /** * 获得表的所有列名 - * - * @param ds 数据源 + * + * @param ds 数据源 * @param tableName 表名 * @return 列数组 * @throws DbRuntimeException SQL执行异常 */ public static String[] getColumnNames(DataSource ds, String tableName) { - List columnNames = new ArrayList(); + List columnNames = new ArrayList<>(); Connection conn = null; - ResultSet rs = null; try { conn = ds.getConnection(); @@ -141,23 +137,26 @@ public class MetaUtil { String schema = getSchema(conn); final DatabaseMetaData metaData = conn.getMetaData(); - rs = metaData.getColumns(catalog, schema, tableName, null); - while (rs.next()) { - columnNames.add(rs.getString("COLUMN_NAME")); + try (ResultSet rs = metaData.getColumns(catalog, schema, tableName, null)) { + if (null != rs) { + while (rs.next()) { + columnNames.add(rs.getString("COLUMN_NAME")); + } + } } return columnNames.toArray(new String[columnNames.size()]); } catch (Exception e) { throw new DbRuntimeException("Get columns error!", e); } finally { - DbUtil.close(rs, conn); + DbUtil.close(conn); } } /** * 创建带有字段限制的Entity对象
* 此方法读取数据库中对应表的字段列表,加入到Entity中,当Entity被设置内容时,会忽略对应表字段外的所有KEY - * - * @param ds 数据源 + * + * @param ds 数据源 * @param tableName 表名 * @return Entity对象 */ @@ -168,8 +167,8 @@ public class MetaUtil { /** * 获得表的元信息 - * - * @param ds 数据源 + * + * @param ds 数据源 * @param tableName 表名 * @return Table对象 */ @@ -177,7 +176,6 @@ public class MetaUtil { public static Table getTableMeta(DataSource ds, String tableName) { final Table table = Table.create(tableName); Connection conn = null; - ResultSet rs = null; try { conn = ds.getConnection(); @@ -188,26 +186,35 @@ public class MetaUtil { final DatabaseMetaData metaData = conn.getMetaData(); // 获得表元数据(表注释) - rs = metaData.getTables(catalog, schema, tableName, new String[] { TableType.TABLE.value() }); - if (rs.next()) { - table.setComment(rs.getString("REMARKS")); + try (ResultSet rs = metaData.getTables(catalog, schema, tableName, new String[]{TableType.TABLE.value()})) { + if (null != rs) { + if (rs.next()) { + table.setComment(rs.getString("REMARKS")); + } + } } // 获得主键 - rs = metaData.getPrimaryKeys(catalog, schema, tableName); - while (rs.next()) { - table.addPk(rs.getString("COLUMN_NAME")); + try (ResultSet rs = metaData.getPrimaryKeys(catalog, schema, tableName)) { + if (null != rs) { + while (rs.next()) { + table.addPk(rs.getString("COLUMN_NAME")); + } + } } // 获得列 - rs = metaData.getColumns(catalog, schema, tableName, null); - while (rs.next()) { - table.setColumn(Column.create(tableName, rs)); + try (ResultSet rs = metaData.getColumns(catalog, schema, tableName, null)) { + if (null != rs) { + while (rs.next()) { + table.setColumn(Column.create(tableName, rs)); + } + } } } catch (SQLException e) { throw new DbRuntimeException("Get columns error!", e); } finally { - DbUtil.close(rs, conn); + DbUtil.close(conn); } return table; @@ -215,7 +222,7 @@ public class MetaUtil { /** * 获取catalog,获取失败返回{@code null} - * + * * @param conn {@link Connection} 数据库连接,{@code null}时返回null * @return catalog,获取失败返回{@code null} * @since 4.6.0 @@ -235,7 +242,7 @@ public class MetaUtil { /** * 获取schema,获取失败返回{@code null} - * + * * @param conn {@link Connection} 数据库连接,{@code null}时返回null * @return schema,获取失败返回{@code null} * @since 4.6.0 diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java index 831f3bc2b..d3b2ee1b9 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java @@ -162,7 +162,7 @@ public class SqlExecutor { * @throws SQLException SQL执行异常 */ public static int[] executeBatch(Connection conn, String sql, Object[]... paramsBatch) throws SQLException { - return executeBatch(conn, sql, new ArrayIter(paramsBatch)); + return executeBatch(conn, sql, new ArrayIter<>(paramsBatch)); } /** @@ -198,7 +198,7 @@ public class SqlExecutor { * @since 4.5.6 */ public static int[] executeBatch(Connection conn, String... sqls) throws SQLException { - return executeBatch(conn, new ArrayIter(sqls)); + return executeBatch(conn, new ArrayIter<>(sqls)); } /**