当前位置: 首页 > news >正文

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);}} 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_nametableNames.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);}}}

相关文章:

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

先看下需求背景&#xff1a; 获取某个数据源连接下所有库名&#xff0c;库下所有表名&#xff0c;表中所有字段 1.MySql 先说MySql吧&#xff0c;最简单 1.1获得所有数据库库名 这是一个mysql和sqlserver公用的方法&#xff0c;这里url不用担心数据库问题&#xff0c;他其实…...

errno变量和显示错误信息

一、errno Linux很多函数发生错误&#xff0c;只会返回-1。因此&#xff0c;我们只知道函数发生了错误&#xff0c;却不知道具体发生了什么错误。 因此Linux 系统下对常见的错误做了一个编号&#xff0c;每一个编号都代表着每一种不同的错误类型。 发生错误时&#xff0c;对…...

Centos 7 安装 Docker Enginee

文章目录 Centos 安装 Docker Enginee系统要求卸载旧版本使用 RPM 仓库设置 Docker 仓库安装 Docker Enginee升级 Docker Enginee 卸载 Docker Centos 安装 Docker Enginee 要在 Centos 安装 Docker Enginee&#xff0c;需要满足以下要求&#xff1a; 系统要求 CentOS 7Cent…...

通过js来实现用身份证号来判断性别和出生年月

html: <input type"text" id"shenfenzhenghao" oninput"hao()" placeholder"证件号"><input type"text" id"xingbie" disabled"disabled" placeholder"性别"><input type&qu…...

华为数通方向HCIP-DataCom H12-831题库(多选题:61-80)

第61题 在MPLS VPN中,为了区分使用相同地址空间的IPV4前缀,将IPV4的地址增加了RD值,下列选项描述正确的是: A、在PE设备上,每一个VPN实例都对应一个RD值,同一PE设备上,必须保证RD值唯一 B、RD可用于来控制VPN路由信息的发布 C、RD在传递过程中作为BGP的扩展团体性封装在…...

【T】03

A 【模板】快速幂 板子&#xff0c;略 #include<bits/stdc.h> #define ll long long using namespace std; ll a,p,k; int main() {scanf("%lld%lld%lld",&a,&p,&k);printf("%lld^%lld mod %lld",a,p,k);ll ans1,wa;a%k;while(p){if(p…...

VBA技术资料MF73:将Logo添加到页眉侧

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…...

听GPT 讲Rust源代码--library/std(1)

std git:(master) ✗ tree.├── Cargo.toml├── benches│ ├── hash│ │ ├── map.rs│ │ ├── mod.rs│ │ └── set_ops.rs│ └── lib.rs├── build.rs├── src│ ├── alloc.rs│ ├── ascii.rs│ ├── backtrace│ │…...

Vue源码总结

1&#xff0c;根据vue工程package.json配置文件查看scripts命令&#xff0c;找到build命令执行的js文件 2&#xff0c;根据构建执行的js文件继续跟进&#xff0c;找到主入口文件 3&#xff0c;从主入口文件直接分析主干代码&#xff0c;追踪export的Vue对象 4&#xff0c;跟…...

记一次调试微信订阅消息的坑

微信发送订阅消息文档 发送订阅消息 | 微信开放文档 按照文档说明的&#xff0c;一直报data param错误&#xff0c;编码47001&#xff0c;从程序中把请求参数扣出来&#xff0c;放到微信提供的工具里面调试 微信调试工具 然后报data参数要用string&#xff0c;转化为string…...

ASP.NET Core3.1 API 创建(Swagger配置、数据库连接Sql Server)、开发、部署

文章目录 创建项目点击Nuget安装包删除原有controllers编辑新建controll、添加注释Startup 注册Swagger服务使用swagger中间件配置XML注释更改启动端口 launchsettings.json在startup.cs跨域处理运行 数据库设计与连接安装库新建类继承框架根据数据库表设计对应设计类在DataCon…...

大数据之LibrA数据库常见术语(八)

SCTP Stream Control Transmission Protocol&#xff0c;流控制传输协议。是IETF于2000年新定义的一个传输层协议。是提供基于不可靠传输业务的协议之上的可靠的数据报传输协议。SCTP的设计用于通过IP网传输SCN窄带信令消息。 Session 数据库系统在接收到应用程序的连接请求时…...

【实战】Kubernetes安装持久化工具NFS-StorageClass

文章目录 前言技术积累存储类&#xff08;storage class&#xff09;什么是NFS什么是PV\PVC为什么要用NFS-StorageClass 安装NFS-StorageClass保证K8S集群正常投用安装NFS工具与客户端NFS安装常见错误安装NFS-StorageClass存储器 前言 前面的博文我们介绍了如何用kuberadmin的…...

透明安全地解释Moonbeam基金会分配的GLMR去了哪

在GLMR分配比例中&#xff0c;约有16.7%的GLMR分配给了生态支持。这部分GLMR究竟用在了哪里&#xff0c;Moonbeam生态是否还有足够的GLMR扶持生态项目&#xff1f; Moonbeam基金会每隔半年会发布一份GLMR透明度报告&#xff0c;最近的报告日期为2023年7月31日。其中列出了社区…...

python安装包失败 安装scipy包

最近在配深度学习环境&#xff0c;安装好了conda、CUDA、cuDNN&#xff0c;运行之后报错&#xff0c;没有scipy包。 试了很多方法&#xff1a; 用命令行pip、conda install 在pycharm下载包 在环境中添加包 都失败了 要么直接ERROR&#xff0c;要么超时 问了师兄 需要在conda环…...

解决javascript报错:SyntaxError: Invalid Unicode escape sequence

在处理cookie时报这个错&#xff1a; 网上搜了一圈都说是反斜杠问题&#xff0c;要把\替换成/ 但是试了网上的replace替换&#xff1a; replace(/\\/g, /) 结果没有用&#xff01;&#xff01;&#xff01; 然后我干脆直接做了一个最简单字符串赋值&#xff0c;再打印出来。…...

【Python第三方包】使用Python的Translate包进行文本翻译

文章目录 前言一、Translator类的初始化参数二、translate函数三、翻译示例代码1.1 示例代码11.2 示例代码2总结前言 在现代互联网时代,跨语言翻译已经成为了不可或缺的工具。不仅对于个人,对于企业和开发者来说,实现文本翻译在国际化、多语言支持以及内容本地化方面都具有…...

【OpenCV实现图像阈值处理】

文章目录 概要简单阈值调整自适应阈值调整大津(Otsus)阈值法Otsus 二值化是如何工作的 概要 OpenCV库中的图像处理技术&#xff0c;主要分为几何变换、图像阈值调整和平滑处理三个部分。 在几何变换方面&#xff0c;OpenCV提供了cv.warpAffine和cv.warpPerspective函数&#…...

【Python机器学习】零基础掌握StackingRegressor集成学习

如何更准确地预测糖尿病患者的血糖水平? 糖尿病是一种影响全球数百万人的慢性疾病。有效地管理和预测血糖水平是糖尿病患者日常生活的重要一环。单一的预测模型(比如线性回归、支持向量机等)虽然有一定的效果,但在处理复杂的医疗数据时,其准确性可能会受到限制。 为了准…...

JVM(Java Virtual Machine)G1收集器篇

前言 本文参考《深入理解Java虚拟机》&#xff0c;本文主要介绍G1收集器的收集思想和具体过程&#xff08;填上一篇文章留下的坑&#xff09; 本系列其他文章链接&#xff1a; JVM&#xff08;Java Virtual Machine&#xff09;内存模型篇 JVM&#xff08;Java Virtual Machi…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...