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

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

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

相关文章

程序的编译和链接

目录 翻译环境 linux下的测试 ​编辑 预定义符号 执行环境 #define定义宏 #和## # ## 宏参数的副作用 宏和函数对比 优点 缺点 #undef 条件编译 头文件包含 在标准c的任何实现中&#xff0c;存在两种环境——翻译环境和执行环境 翻译环境 翻译环境生成目标文件…

2023年中国磷酸一铵行业产能、产量及发展趋势分析:农业需求稳定增长[图]

磷酸一铵是一种重要的氮磷复合肥料&#xff0c;在农业生产中广泛应用。亚洲地区尤其是中国、印度等国家是磷酸一铵的主要消费市场。近年来&#xff0c;中国磷酸一铵产能呈现下降趋势&#xff0c;2022年开始恢复增长。2022年中国磷酸一铵产能达1945万吨&#xff0c;同比增长5.4%…

linux工具篇

文章目录 linux工具篇1. linux 软件包管理器-yum1.1 什么是软件包1.2 yum的使用1.3 yum源 2. linux编辑器-vim2.1 vim概念2.2 vim各个模式切换2.3 vim正常模式命令汇总2.4 vim底行模式各命令汇总2.5 vim的简单配置 3. Linux编译器-gcc/g使用3.1 复习程序编译过程(1) 预处理(2) …

二进制安装k8s

192.168.11.12 master01 192.168.11.12 y4 node01 192.168.11.14 y5 node02 192.168.11.15 对环境进行初始化&#xff0c;主机192.168.11.12、主机y4、主机y5&#xff0c;三台主机都要做以下操作&#xff0c;唯一不同的就是修改主…

04.Finetune vs. Prompt

目录 语言模型回顾大模型的两种路线专才通才二者的比较 专才养成记通才养成记Instruction LearningIn-context Learning 自动Prompt 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索 语言模型回顾 GPT&#xff1a;文字接龙 How are __. Bert&a…

如何为3D模型设置自发光材质?

1、自发光贴图的原理 自发光贴图是一种纹理贴图&#xff0c;用于模拟物体自发光的效果。其原理基于光的发射和反射过程。 在真实世界中&#xff0c;物体自发光通常是由于其本身具有能够产生光的属性&#xff0c;如荧光物质、发光材料或光源本身。为了在计算机图形中模拟这种效…

应急响应-网站入侵篡改指南_Webshell内存马查杀_漏洞排查_时间分析

1. 前言 一般安服在做项目的时候&#xff0c;经常会遇到需要做应急响应的工作&#xff0c;所谓应急响应就是当网站出现异常的时候&#xff0c;根据相关的问题对其进行溯源分析&#xff0c;发现问题&#xff0c;解决问题。 2. 网络安全异常特征 这里大概汇总一下网络安全异常的…

RustDay06------Exercise[91-100]

91.将指针还原成指定类型 因为指针不知道里面具体有什么,所以一般约定打上unsafe 申明开发者自己对该部分可用性负责,且在调试的时候也能起强调作用 // tests6.rs // // In this example we take a shallow dive into the Rust standard librarys // unsafe functions. Fix …

c语言从入门到实战——分支和循环

分支和循环 前言1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符&#xff1a;&& , || , &#xff01;4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习&#xff1a;闰年的判断4.5 短路 5. swit…

鸡尾酒学习——长岛冰茶

长岛冰茶 1、材料&#xff1a;冰块&#xff08;或者雪莲&#xff09;、白朗姆、伏特加、龙舌兰、金酒、柠檬、君度或者白兰地、可乐&#xff1b; 2、口感&#xff1a;酸甜苦口味&#xff0c;酒的苦涩较为明显&#xff08;怀疑是自己放了过多的柠檬汁导致苦涩感明显&#xff09…

Sui提供dApp Kit 助力快速构建React Apps和dApps

近日&#xff0c;Mysten Labs推出了dApp Kit&#xff0c;这是一个全新的解决方案&#xff0c;可用于在Sui上开发React应用程序和去中心化应用程序&#xff08;dApps&#xff09;。mysten/dapp-kit是专门为React定制的全新SDK&#xff0c;旨在简化诸如连接钱包、签署交易和从RPC…

若依微服务上传图片文件代理配置

在使用若依微服务文件上传时候,文件上传成功会上传到D:/ruoyi/uploadPath目录下。默认使用9300端口进行访问图片文件,现在我想把它代理到80端口应该怎么做呢? 配置前:http://localhost:9300/statics/2023/09/24/test.jpg 配置后:http://localhost/statics/2023/09/24/test…

JWT的登录认证与自校验原理分析

目录 一、JWT的概述 1.什么是JWT&#xff1f; 2.JWT的用户认证 3.JWT解决了什么问题&#xff1f; 4.关于JWT中的签名如何理解&#xff1f; 5.JWT的优势 二、JWT的结构 1.令牌的组成&#xff1a; 2.JWT的工具类 3.JWT所需的依赖 4.JWT登录生成Token的原理 三、JWT的自…

浅谈智能制造

智能制造 如今&#xff0c;同一版本同一型号的手机&#xff0c;几乎是一模一样的。当我们说去选购商品&#xff0c;其实是在有限的型号中选择我们需要的那一款。可是&#xff0c;人的需求千变万化&#xff0c;为什么偏偏要归结到几个固定的型号上去呢&#xff1f;每个人不应该…

图片放大镜效果

安装&#xff1a; vueuse 插件 npm i vueuse/core 搜索&#xff1a; useMouseInElement 方法 <template><div ref"target"><h1>Hello world</h1></div> </template><script> import { ref } from vue import { useM…

【Python 算法】信号处理通过陷波滤波器准确去除工频干扰

对于一个信号来说通常汇入工频噪声往往是因为交流电产生的电泳&#xff0c;影响了我们信号采集导致信号上存在工频干扰。 那么matlab去除工频干扰可以通过陷波滤波器实现。 通常使用scipy.signal实现信号的处理。 Scipy的信号处理模块&#xff08;scipy.signal&#xff09;来创…

day02:DML DQL DCL

目录 一:DML 二:DCL 三:DCL 一:DML 1:概念:数据操作原因&#xff0c;对数据进行增删改。 2:三个操作 (1):增加:insert id name age gender 1 令狐冲 23 男 2(添加的数据)风清扬25男 1--->给指定字段添加数据:insert into 表名(字段1&#xff0c;字段2--)values…

攻防世界-web-FlatScience

1. 题目描述 打开链接&#xff0c;看到如下界面 界面上的链接都点击下&#xff0c;发现都是一些英文论文 这些暂时是我们从界面上能发现的全部信息了 2. 思路分析 && 解题过程 2.1 先将网站使用nikto命令扫描一下 我们发现除了显式的界面外&#xff0c;还有两个隐藏…

Mysql数据库 4.SQL语言 DQL数据操纵语言 查询

DQL数据查询语言 从数据表中提取满足特定条件的记录 1.单表查询 2.多表查询 查询基础语法 select 关键字后指定要查询到的记录的哪些列 语法&#xff1a;select 列名&#xff08;字段名&#xff09;/某几列/全部列 from 表名 [具体条件]&#xff1b; select colnumName…

华为昇腾NPU卡 大模型LLM ChatGLM2模型推理使用

参考&#xff1a;https://gitee.com/mindspore/mindformers/blob/dev/docs/model_cards/glm2.md#chatglm2-6b 1、安装环境&#xff1a; 昇腾NPU卡对应英伟达GPU卡&#xff0c;CANN对应CUDA底层&#xff1b; mindspore对应pytorch&#xff1b;mindformers对应transformers 本…