Mysql,SqlServer,Oracle获取库名 表名 列名

先看下需求背景:

获取某个数据源连接下所有库名,库下所有表名,表中所有字段

1.MySql

先说MySql吧,最简单

1.1获得所有数据库库名

这是一个mysql和sqlserver公用的方法,这里url不用担心数据库问题,他其实用的是ip,端口号,用户名,密码 这些信息就行,但是因为url上没有数据库名字的话无法建立连接,所以url上就不得不带着。

实际上这个方法可以获取到该连接下的所有数据库

jdbc:sqlserver://127.0.0.1:3306;databaseName=master;encrypt=true;trustServerCertificate=true

jdbc:mysql://127.0.0.1:3306/test

 private static final String TABLE_CAT = "TABLE_CAT";

    /**
     * 获取连接下所有的数据库名称  mysql和sqlserver可用
     *
     * @param url
     * @param user
     * @param password
     * @return
     */
    public static List<String> getDBNames(String url, String user, String password) {
        Connection conn = null;
        List<String> list = new ArrayList<>();
        try {
            conn = DriverManager.getConnection(url, user, password);
            DatabaseMetaData metadata = conn.getMetaData();
            ResultSet resultSet = metadata.getCatalogs();
            while (resultSet.next()) {
                String databaseName = resultSet.getString(TABLE_CAT);
                list.add(databaseName);
                System.out.println(databaseName);
            }
            return list;
        } catch (SQLException e) {
            log.error(e.getMessage());
        } finally {
            //finally中关闭连接
            if (Objects.nonNull(conn)) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return list;
    }

1.2 获取某个库下所有表名

这个方法也不用替换url中的数据库名,但是需要把数据库名作为参数上传

因为查询sql中用到了数据库名

SELECT table_name FROM information_schema.tables WHERE table_schema = 
 private static final String TABLE_NAME = "TABLE_NAME";   
 /**
     * 获取数据库下所有表名  mysql sqlserver使用
     *
     * @param url
     * @param user
     * @param password
     * @param dbName
     * @return
     */
    public static List<String> getMysqlTableNames(String url, String user, String password, String dbName) {
        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        List<String> tableNames = new ArrayList<>();
        StringBuilder stringBuilder = new StringBuilder();
        String query = stringBuilder.append("SELECT table_name FROM information_schema.tables WHERE table_schema = ").append("'").append(dbName).append("'").toString();
        try {
            conn = DriverManager.getConnection(url, user, password);
            statement = conn.createStatement();
            resultSet = statement.executeQuery(query);
            while (resultSet.next()) {
                String tableName = resultSet.getString(TABLE_NAME);
                tableNames.add(tableName);
            }
        } catch (SQLException e) {
            log.error(e.getMessage());
        } finally {
            //finally中关闭连接
            try {
                if (Objects.nonNull(conn)) {
                    conn.close();
                }
                if (Objects.nonNull(statement)) {
                    statement.close();
                }
                if (Objects.nonNull(resultSet)) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        return tableNames;
    }

1.3 获取表中的所有列名

这个很简单,就执行个select * from 就可以

但是注意 url需要替换 现在新选择的库名是什么,那就把url中的databaseName替换为新选择的

这也是一个mysql和sqlserver可以公用的

但是sqlserver有一点需要注意,就是最后一个参数 tableName 需要上传为 模式名.表名

因为对于sql来说正常执行查询sql的时候 也要 模式名.表名 查询

select * from dbo.spt_fallback_db
    /**
     * 获取表下所有字段  其中url记得把前端新传来库的替换
     *
     * @param url
     * @param user
     * @param password
     * @param tableName
     * @return
     * @throws SQLException
     */
    public static List<String> getColumns(String url, String user, String password, String tableName) {
        //用新的dbName对连接上的dbName进行替换
        List<String> columns = new ArrayList<>();
        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        StringBuilder stringBuilder = new StringBuilder();
        String query = stringBuilder.append("select * from ").append(tableName).append(" where 1!=1").toString();
        try {
            conn = DriverManager.getConnection(url, user, password);
            statement = conn.createStatement();
            resultSet = statement.executeQuery(query);
            ResultSetMetaData metaData = resultSet.getMetaData();
            for (int i = 1; i <= metaData.getColumnCount(); i++) {
                String columnName = metaData.getColumnName(i);
                columns.add(columnName);
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值