问题解决:DATABASEMETADATA.GETTABLES()方法,返回了所有库中的表

本文档介绍了在使用Java连接MySQL8.0数据库时,通过DatabaseMetaData获取本地数据库`db_test`表信息出现错误的问题。问题根源在于`nullCatalogMeansCurrent`属性默认值改变。解决方法是在URL后添加`&nullCatalogMeansCurrent=true`,以正确获取表信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本地代码

//获取表所有字段
private List<String> getFieldListFromConnectMetaData(@NonNull DatabaseConnectModel model, String tableName) {
        try {
            Class.forName(model.getDriverClassName());
            Connection connection = DriverManager.getConnection(model.getUrl(),
                    model.getUsername(), model.getPassword());
            ResultSet rs = connection.getMetaData().getColumns(null, null, tableName, null);
            List<String> fieldNameList = Lists.newArrayList();
            while (rs.next()) {
                fieldNameList.add(rs.getString("COLUMN_NAME"));
            }
            return fieldNameList;
        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

//获取库所有表
private List<String> getTableListFromConnectMetaData(@NonNull DatabaseConnectModel model) {
        try {
            Class.forName(model.getDriverClassName());
            Connection connection = DriverManager.getConnection(model.getUrl(),
                    model.getUsername(), model.getPassword());
            ResultSet rs = connection.getMetaData().getTables(null, null, "%", new String[]{});
            List<String> tableNameList = Lists.newArrayList();
            while (rs.next()) {
                tableNameList.add(rs.getString("TABLE_NAME"));
            }
            return tableNameList;
        } catch (ClassNotFoundException | SQLException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }

返回的字段列和表都是重复的

DatabaseMetaData .getTables()方法常常用来获取数据库中的所有表信息。
但我想要获取我的本地数据库db_test中的表信息,出现了错误。

解决方案

  mysql8.0的驱动,在5.5之前nullCatalogMeansCurrent属性默认为true,8.0中默认为false官网链接地址。所以导致DatabaseMetaData.getTables()加载了全部的无关表。

  解决方法是,在jdbc 创建连接的url后加上&nullCatalogMeansCurrent=true

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值