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

news2024/10/2 20:25:15

先看下需求背景:

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

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);
            }
        } 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 columns;
    }

2.SqlServer

2.1获得所有数据库名

直接看1.1就行 跟mysql公用一个

2.2获得某个库下所有表名

这个url中的数据库名字需要替换为新选择的

而且返回方式,是 模式名.表名 的方式返回的,以便之后查询使用

select * from new_schema.table_name

获得所有表名的sql 

SELECT s.name AS schema_name,t.name AS table_name 
FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
    private static final String SCHEMA_NAME = "SCHEMA_NAME";

    private static final String COLUMN_NAME = "column_name";

    /**
     * 获取数据库下所有表名 sqlserver使用 url需要替换
     *
     * @param url
     * @param user
     * @param password
     * @return
     */
    public static List<String> getSqlServerTableNames(String url, String user, String password) {
        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        List<String> tableNames = new ArrayList<>();
        String query = "SELECT s.name AS schema_name,t.name AS table_name FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id";
        try {
            conn = DriverManager.getConnection(url, user, password);
            statement = conn.createStatement();
            resultSet = statement.executeQuery(query);
            while (resultSet.next()) {
                String schemaName = resultSet.getString(SCHEMA_NAME);
                String tableName = resultSet.getString(TABLE_NAME);
                //sqlserver查询需要用模式名.表名 如select * from new_schema.table_name 所以拼接返回 存储时也是拼接好的存起来new_schema.table_name
                tableNames.add(schemaName.concat(Constant.POINT).concat(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;
    }

2.3获得表中所有列名

直接看1.3就行,跟mysql公用一个

注意点跟Mysql也一样,url中数据库名字要替换为新选择的

还有就是 sqlserver 要 模式名.表名

3.Oracle

oracle真的是一个特别的存在

oracle连接url中的长得像库名的东西,其实不是库名,是SID,他俩不是一个含义

ORACLE_SID、实例名和数据库名的区别及查看方法_oracle数据库名称和sid的关系-CSDN博客

jdbc:oracle:thin:@127.0.0.1:3306:helowin

 

还有就是对于oracle来说你用dbeaver这个连接工具操作更好一点,别用datagrip了

对于oracle来说新建数据库其实就是新建用户,建好了是要授权,才能生效

授权 

Oracle 创建用户详解(create user)-CSDN博客

3.1获得所有库名

了解好了前边的那些知识点,再来进行接下来的操作

    /**
     * 获得oracle下所有数据库名称
     *
     * @param url
     * @param user
     * @param password
     * @return
     */
    public static List<String> getOracleDBNames(String url, String user, String password) throws Exception {
        Connection conn = null;
        List<String> list = new ArrayList<>();
        try {
            conn = DriverManager.getConnection(url, user, password);
            ResultSet schemas = conn.getMetaData().getSchemas();
            while (schemas.next()) {//如果对象中有数据,就会循环打印出来
                String dbName = schemas.getString("TABLE_SCHEM");
                log.info(dbName);
                list.add(dbName);
            }
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new Exception("oracle数据库连接信息有误,请检查数据源");
        } finally {
            //finally中关闭连接
            if (Objects.nonNull(conn)) {
                conn.close();
            }
        }
    }

这个我找了好久,附上源码截图

把源码里边的sql粘出来执行,附上执行结果截图

所以其实你用

resultSet.getString(TABLE_SHEM);

也是可以取到库名的

3.2获得某个库下所有表名

 前边说了,对于oracle来说,新建库其实就是新建用户(上边有DBeaver截图为证)

所以想要查库下所有表,就要用owner

select TABLE_NAME from all_tables WHERE owner=

而且url中库名也不用替换为新的,因为sql中会用新的库名 

 private static final String TABLE_NAME = "TABLE_NAME";

    /**
     * 获取oracle指定库下的所有表名
     *
     * @param url
     * @param user
     * @param password
     * @return
     */
    public static List<String> getOracleTableNames(String url, String user, String password, String dbName) {
        Connection conn = null;
        List<String> list = new ArrayList<>();
        Statement stmt = null;
        ResultSet resultSet = null;
        try {
            conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement();
            //dba权限才能执行Sselect TABLE_NAME from all_tables WHERE owner="+dbName  在没有那么高权限,且数据库连接建立成功的情况下,只返回数据源那里配置的数据库
            StringBuilder stringBuilder = new StringBuilder();
            String string = stringBuilder.append("select TABLE_NAME from all_tables WHERE owner=").append("'").append(dbName).append("'").toString();
            resultSet = stmt.executeQuery(string);
            //有dba权限情况下才会执行这部
            while (resultSet.next()) {//如果对象中有数据,就会循环打印出来
                String tableName = resultSet.getString(TABLE_NAME);
                log.info(tableName);
                list.add(tableName);
            }
            return list;
        } catch (SQLException e) {
            //select TABLE_NAME from all_tables WHERE owner="+dbName 这个语句可能没有权限执行
            log.error(e.getMessage());
            return list;
        } finally {
            //finally中关闭连接
            try {
                if (Objects.nonNull(conn)) {
                    conn.close();
                }
                if (Objects.nonNull(stmt)) {
                    stmt.close();
                }
                if (Objects.nonNull(resultSet)) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

3.3获取表中所有列名

这里url也不用替换库名,但是方法查询要上传新的库名和表名

SELECT COLUMN_NAME  FROM ALL_TAB_COLUMNS WHERE owner= 
AND table_name=

    /**
     * 获取oracle指定库表下的所有列名
     *
     * @param url
     * @param user
     * @param password
     * @return
     */
    public static List<String> getOracleColumNames(String url, String user, String password, String dbName, String tableName) {
        Connection conn = null;
        List<String> list = new ArrayList<>();
        Statement stmt = null;
        ResultSet resultSet = null;
        try {
            conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement();
            StringBuilder stringBuilder = new StringBuilder();
            //通过库名表名获取到列名
            String string = stringBuilder.append("SELECT COLUMN_NAME  FROM ALL_TAB_COLUMNS WHERE owner=").append("'").append(dbName).append("'")
                    .append(" AND table_name=").append("'").append(tableName).append("'").toString();
            resultSet = stmt.executeQuery(string);
            //有dba权限情况下才会执行这部
            while (resultSet.next()) {//如果对象中有数据,就会循环打印出来
                String columName = resultSet.getString(COLUMN_NAME);
                log.info(columName);
                list.add(columName);
            }
            return list.stream().distinct().collect(Collectors.toList());
        } catch (SQLException e) {
            //select TABLE_NAME from all_tables WHERE owner="+dbName 这个语句可能没有权限执行
            log.error(e.getMessage());
            return list;
        } finally {
            //finally中关闭连接
            try {
                if (Objects.nonNull(conn)) {
                    conn.close();
                }
                if (Objects.nonNull(stmt)) {
                    stmt.close();
                }
                if (Objects.nonNull(resultSet)) {
                    resultSet.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次渗透测试事件

一、漏洞发现 拿到登录的接口&#xff0c;丢到sqlmap里面跑一把&#xff0c;发现延时注入 进一步查询&#xff0c;发现是sa权限&#xff0c;直接os-shell whomai查询发现是管理员权限 os-shell执行命令太慢了&#xff0c;直接进行nc 反弹 执行base64 加密后的powershell命令&…

DevEco Studio如何在真机设备上运行HarmonyOS应用之必备的签名文件怎么做

DevEco Studio如何在真机设备上运行HarmonyOS应用 准备签名文件 使用DevEco Studio生成密钥和证书请求文件&#xff08;生成密钥和证书&#xff09; 在DevEco Studio的主菜单栏点击Build > Generate Key 如果没有密钥库文件&#xff0c;点击New进行创建&#xff0c;弹出…

如何使用 PostgreSQL 进行数据迁移和整合?

​ PostgreSQL 是一个强大的开源关系型数据库管理系统&#xff0c;它提供了丰富的功能和灵活性&#xff0c;使其成为许多企业和开发者的首选数据库之一。在开发过程中&#xff0c;经常会遇到需要将数据从一个数据库迁移到另一个数据库&#xff0c;或者整合多个数据源的情况。…

做机器视觉工程师,苏州德创能不能去工作?

每一家公司都有自身特点&#xff0c;同时也每一家都有自身的bug。 苏州德创作为美国康耐视Cognex产品在华东最大的代理商&#xff0c;也是康耐视外包团队。那么苏州德创有哪些业务构成&#xff0c;业务的构成也是其招聘的主要人员的方向。 设备视觉供应商&#xff0c;如卓越&…

免杀对抗-防溯源拉黑+防流量审计

防朔源拉黑-CDN节点 1.购买一个域名&#xff0c;开启开启cdn 2.全球ping一下域名&#xff0c;可以看到cdn生效 3.根据自己cs版本修改对应c2项目文件 下载&#xff1a;https://github.com/threatexpress/malleable-c2 打开文件搜索http-get&#xff0c;将如下图修改为设置cdn的域…

动手学深度学习—网络中的网络NiN(代码详解)

目录 1. NiN块2. NiN模型3. 训练模型 LeNet、AlexNet和VGG都有一个共同的设计模式&#xff1a; 通过一系列的卷积层与汇聚层来提取空间结构特征&#xff1b;然后通过全连接层对特征的表征进行处理。 如果在过程的早期使用全连接层&#xff0c;可能会完全放弃表征的空间结构。 …

Unsupervised Medical Image Translation with Adversarial Diffusion Models

基于对抗扩散模型的无监督医学图像翻译 论文链接&#xff1a;https://arxiv.org/abs/2207.08208 项目链接&#xff1a;https://github.com/icon-lab/SynDiff Abstract 通过源-目标模态转换对缺失图像进行补全可以提高医学成像方案的多样性。利用生成对抗网络(GAN)进行一次映…

string类型数据的基本操作

1.string类型的基本操作 2.string类型数据的扩展操作 2.1 增加和减少 2.2 控制数据的生命周期 3.string类型数据操作的注意事项

nginx中gzip推荐配置

#开启gzip压缩功能 gzip on; #设置允许压缩的页面最小字节数; 这里表示如果文件小于10个字节,就不用压缩,因为没有意义,本来就很小. gzip_min_length 10k; #设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存 gzip_buffers 4 16k;#压缩版本 gzip_http_version 1…

PDCA项目开发环境搭建说明

PDCA项目开发环境搭建说明 环境准备 JDK 15.0 &#xff1b; IDEA Community Edition 2021.3 版本要对应&#xff0c;不然会报错 Jdk 安装步骤&#xff1a;https://blog.csdn.net/qq_34913677/article/details/108894727 IDea 安装说明&#xff1a;https://blog.csdn.net/dream…

使用项目管理系统优化公众号文章排期

微信公众号已经成为众多企业进行内容营销的关键平台&#xff0c;然而要在这片竞争激烈的领域中脱颖而出&#xff0c;赢得更多的流量和用户关注&#xff0c;仅仅依靠高质量的内容是远远不够的。使用Zoho Projects项目管理系统&#xff0c;帮助您实现文章发布的精细化管理是一个不…

“荷风常盛·非遗中国传承大会”在京召开,北京市珐琅厂隆重发布国事作品《荷风常盛·中国禧》

“荷风常盛非遗中国传承大会”于10月21日在北京雁栖湖圆满举办。大会由中国景泰蓝第一家北京市珐琅厂、北京设计学会主办。期间由北京市珐琅厂出品的景泰蓝《荷风常盛中国禧》首次亮相&#xff0c;惊艳与会的各界艺术文化领导、专家、学者&#xff0c;以及一带一路国家驻华使节…

C++常用标准算法

算法主要由头文件<algorithm>、<functional>、<numeric>组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、交换、查找、遍历、赋值、修改等等&#xff1b;<numeric>体积很小&#xff0c;只包括几个在序列上面进行简单…

【@EnableWebMvc的原理】

用途 启用SpringMvc 的 Java 配置类&#xff0c;代替 xml 格式的配置文件。 一、查看运用&#xff08;注解 EnableWebMvc &#xff0c;实现 WebMvcConfigurer &#xff09; Component("com.ibicd") EnableWebMvc public class AppConfig implements WebMvcConfigu…

Ceres 使用笔记

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 概念理解 Part.II 简单使用Chap.I Ceres 中主要函数简介Chap.II 一个简单的实例 Reference Part.I Introduction Ceres 1 是由 Google 开发的开源 C 通用非线性优化库&#xff0c;与 g2o 并列为目前视觉 SLAM 中应用最广泛…

GRE和MGRE笔记

目录 前言&#xff1a; 一、VPN 1、技术背景&#xff1a; 2、作用&#xff1a; 3、优势&#xff1a; 4、隧道技术 5、分类 二、GRE 1、GRE简介&#xff1a; 2、GRE VPN&#xff1a; 3、GRE报文结构 4、GRE VPN工作过程 5、GRE VPN 的优缺点&#xff1a; 6、多Tun…

Java访问修饰符private、default、protected、public的区别

Java有四种访问权限&#xff0c;其中三种有访问权限修饰符&#xff0c;分别为private&#xff0c;public和protected&#xff0c;还有一种不带任何修饰符&#xff1a; 1、private&#xff0c;私有的&#xff0c;被private修饰的类、方法、属性、只能被本类的对象所访问。我什么…

订水商城H5实战教程-03用户协议

目录 1 创建页面2 为文本组件增加事件3 检查用户协议是否勾选最终效果 我们上一篇介绍了打开首页时弹出登录窗口的功能&#xff0c;本篇我们实现一下用户协议。 1 创建页面 功能是点击用户协议的时候打开具体的协议内容&#xff0c;需要先创建一个页面。打开自定义应用&#x…

云原生之深入解析Kubernetes集群内的服务通信机制

一、传统的服务到服务通信 先了解一下支持服务间通信的 3 个原生 K8s 对象&#xff1a;ClusterIP Service、DNS 和 Kube-Proxy&#xff1a; 在进入 Kubernetes 生态系统之前&#xff0c;快速了解一下传统的服务到服务通信&#xff1a;通信是通过 IP 地址进行的&#xff0c;因此…

数组对象深拷贝

多层嵌套的数组对象使用扩展运算符原数组依然被修改&#xff1a; let arr [{name:a,num:1,children:[{name:a1,num:1,},{name:a2,num:2,},{name:a3,num:3,}]},{name:b,num:1,children:[{name:b1,num:1,},{name:b2,num:2,}]}] let arr2 [...arr] arr2[0].children.splice(1,1…