新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 程序开发 > 语言 > JAVA

Java代码获取数据库表名、字段名、字段类型及注释等信息

时间:2019-06-11 15:01:19  来源:  作者:
Java代码获取数据库表名、字段名、字段类型及注释等信息

在最近的项目中碰到一个数据源的配置需求,就是需要配置公司所有系统的数据库、表等信息,其中大数据部门抽数时需要过滤某些表的敏感字段,如身份证号、手机号等敏感字段。

需要后端动态连接数据库,及获取相应数据库的表、字段等信息。

示例代码如下:

public class DatabaseUtilTest {
private static final Logger logger = LoggerFactory.getLogger(DatabaseTest.class);
private static final String DRIVER = "com.MySQL.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://ip:3306/databasename?useUnicode=true&characterEncoding=utf8";
private static final String USERNAME = "xxx";
private static final String PASSWORD = "xxx";
private static final String SQL = "SELECT * FROM ";// 数据库操作
static {
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
logger.error("can not load jdbc driver", e);
}
}
/**
* 获取数据库连接
*
* @return
*/
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
} catch (SQLException e) {
logger.error("get connection failure", e);
}
return conn;
}
/**
* 关闭数据库连接
* @param conn
*/
public static void closeConnection(Connection conn) {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
logger.error("close connection failure", e);
}
}
}
/**
* 获取数据库下的所有表名
*/
public static List<String> getTableNames() {
List<String> tableNames = new ArrayList<>();
Connection conn = getConnection();
ResultSet rs = null;
try {
//获取数据库的元数据
DatabaseMetaData db = conn.getMetaData();
//从元数据中获取到所有的表名
rs = db.getTables(null, null, null, new String[] { "TABLE" });
while(rs.next()) {
tableNames.add(rs.getString(3));
}
} catch (SQLException e) {
logger.error("getTableNames failure", e);
} finally {
try {
rs.close();
closeConnection(conn);
} catch (SQLException e) {
logger.error("close ResultSet failure", e);
}
}
return tableNames;
}
/**
* 获取表中所有字段名称
* @param tableName 表名
* @return
*/
public static List<String> getColumnNames(String tableName) {
List<String> columnNames = new ArrayList<>();
//与数据库的连接
Connection conn = getConnection();
PreparedStatement pstemt = null;
String tableSql = SQL + tableName;
try {
pStemt = conn.prepareStatement(tableSql);
//结果集元数据
ResultSetMetaData rsmd = pStemt.getMetaData();
//表列数
int size = rsmd.getColumnCount();
for (int i = 0; i < size; i++) {
columnNames.add(rsmd.getColumnName(i + 1));
}
} catch (SQLException e) {
logger.error("getColumnNames failure", e);
} finally {
if (pStemt != null) {
try {
pStemt.close();
closeConnection(conn);
} catch (SQLException e) {
logger.error("getColumnNames close pstem and connection failure", e);
}
}
}
return columnNames;
}
/**
* 获取表中所有字段类型
* @param tableName
* @return
*/
public static List<String> getColumnTypes(String tableName) {
List<String> columnTypes = new ArrayList<>();
//与数据库的连接
Connection conn = getConnection();
PreparedStatement pStemt = null;
String tableSql = SQL + tableName;
try {
pStemt = conn.prepareStatement(tableSql);
//结果集元数据
ResultSetMetaData rsmd = pStemt.getMetaData();
//表列数
int size = rsmd.getColumnCount();
for (int i = 0; i < size; i++) {
columnTypes.add(rsmd.getColumnTypeName(i + 1));
}
} catch (SQLException e) {
logger.error("getColumnTypes failure", e);
} finally {
if (pStemt != null) {
try {
pStemt.close();
closeConnection(conn);
} catch (SQLException e) {
logger.error("getColumnTypes close pstem and connection failure", e);
}
}
}
return columnTypes;
}
/**
* 获取表中字段的所有注释
* @param tableName
* @return
*/
public static List<String> getColumnComments(String tableName) {
List<String> columnTypes = new ArrayList<>();
//与数据库的连接
Connection conn = getConnection();
PreparedStatement pStemt = null;
String tableSql = SQL + tableName;
List<String> columnComments = new ArrayList<>();//列名注释集合
ResultSet rs = null;
try {
pStemt = conn.prepareStatement(tableSql);
rs = pStemt.executeQuery("show full columns from " + tableName);
while (rs.next()) {
columnComments.add(rs.getString("Comment"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
closeConnection(conn);
} catch (SQLException e) {
logger.error("getColumnComments close ResultSet and connection failure", e);
}
}
}
return columnComments;
}
public static void main(String[] args) {
List<String> tableNames = getTableNames();
System.out.println("tableNames:" + tableNames);
for (String tableName : tableNames) {
System.out.println("================start==========================");
System.out.println("==============================================");
System.out.println("ColumnNames:" + getColumnNames(tableName));
System.out.println("ColumnTypes:" + getColumnTypes(tableName));
System.out.println("ColumnComments:" + getColumnComments(tableName));
System.out.println("==============================================");
System.out.println("=================end=======================");
}
}
}

如是获取多个数据库的信息,上面的DATABASE_URL,USERNAME,PASSWORD可以动态替换。出于安全性的考虑,在实际的编码中建议数据库的用户名和密码不要硬编码在代码中,即使出现也建议进行加密处理。数据库的用户名和密码是非常非常敏感的信息,任何时候都需要非常注意!!!



Tags:Java   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
Tomcat9.0压缩版本安装教程1. 使用Tomcat前必须确保jdk 安装成功;2. 需要配置环境变量命名JAVA_HOME如图所示: 3. 把Tocmcat压缩包解压到你想要放的文件夹如图所示: 4. 打开解...【详细内容】
2019-11-27   Java  点击:(0)  评论:(0)  加入收藏
大概每个人在学生时代开始就使用Java了,我们一直在学习Java,但Java中总有一些概念含混不清,不论是对初级还是高级程序员都是如此。所以,这篇文章的目的就是弄清楚这些概念。读完本文你会对这些概念有更深入的了解,还能弄清...【详细内容】
2019-11-27   Java  点击:(0)  评论:(0)  加入收藏
作为一个Java开发人员,有些常用的Linux命令必须掌握。即使平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令。因为很多服务器上都是Linux系统。所以,要和服...【详细内容】
2019-11-26   Java  点击:(4)  评论:(0)  加入收藏
笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现。1、插入排序1)算法简介插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原...【详细内容】
2019-11-22   Java  点击:(4)  评论:(0)  加入收藏
首先说明此次macOS下配置Java11环境的软件版本信息macOS是基于目前(2019/11/21)最新的macOS10.15.1JDK是基于JDK11最新版本的JDK11.0.5macOS下载JDK如果想要开发Java程序,必...【详细内容】
2019-11-22   Java  点击:(8)  评论:(0)  加入收藏
1、CMD    命令提示符(Command Processor)(CMD)    CMD命令:开始->运行->键入 cmd(在命令行里可以看到系统版本、文件系统版本)2、对文件夹操作的部分命令 启动:win+R 切换盘...【详细内容】
2019-11-22   Java  点击:(5)  评论:(0)  加入收藏
算法一:分治法基本概念1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题&hellip;&hellip;直到最后子问题可以简单的直接求解,原问题的解即...【详细内容】
2019-11-21   Java  点击:(5)  评论:(0)  加入收藏
1 创建一个简单的servlet代码示例:package springmvc;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import j...【详细内容】
2019-11-20   Java  点击:(5)  评论:(0)  加入收藏
最近小L会听到很多学员说,在面试大型互联网公司的时候,很可能会被问到消息队列的问题: 在何种场景下使用了消息中间件? 为什么要在系统里引入消息中间件? 如何实现幂等?链式调...【详细内容】
2019-11-20   Java  点击:(4)  评论:(0)  加入收藏
前言最近给一个非 Java 方向的朋友讲了下双亲委派模型,朋友让我写篇文章深度研究下JVM 的 ClassLoader,我确实也好久没写 JVM 相关的文章了,有点手痒痒,涂了皮炎平也抑制不住的...【详细内容】
2019-11-19   Java  点击:(8)  评论:(0)  加入收藏
一.Java虚拟机工具JDK 本身提供了很多方便的 JVM 性能调优监控工具,除了 jps、jstat、jinfo、jmap、jhat、jstack 等小巧的工具,还有集成式的 jvisualvm 和 jconsole。1.jpsjp...【详细内容】
2019-11-15   Java  点击:(10)  评论:(0)  加入收藏
Java 9的新特性java模块系统 (Java Platform Module System)。模块系统的使用:HTTP 2 客户端:HTTP/2标准是HTTP协议的最新版本,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流...【详细内容】
2019-11-14   Java  点击:(20)  评论:(0)  加入收藏
前端日常开发中,我们使用喜爱的 IDE 调试 JavaScript 代码,比如我喜欢的代码编辑器有两个,Sublime Text 3 和 VS Code,前几年还使用过 Atom,偶尔我们会遇到临时需要快速分享给同...【详细内容】
2019-11-14   Java  点击:(10)  评论:(0)  加入收藏
目录: 第一部分:数组 第二部分:函数 第三部分:字符串 第四部分:对象 第五部分:数字 第六部分:浏览器操作及其它1. 第一部分:数组1. `all`:布尔全等判断const all = (arr, fn = Boole...【详细内容】
2019-11-12   Java  点击:(10)  评论:(0)  加入收藏
字符尽管字符和字符串名字相似;但在JAVA中是两个不同的类型;字符类型char是基本数据类型,(character的缩写)。一个char保存一个Unicode字符:char oneChar = &#39;A&#39;;char anot...【详细内容】
2019-11-12   Java  点击:(8)  评论:(0)  加入收藏
1 JDK常用命令1.1 jsp命令jps虚拟机进程状态工具。具体的执行结果如下: jps命令格式:jps [options] [hostid]jps的其他常用选项 命令格式中,如果需要查看远端机器上的进程,则需...【详细内容】
2019-11-12   Java  点击:(8)  评论:(0)  加入收藏
从数据来源或者说是操作对象角度看,IO 类可以分为:1、文件:FileInputStream、FileOutputStream、FileReader、FileWriter2、数组: ByteArrayInputStream、ByteArrayOutputStrea...【详细内容】
2019-11-12   Java  点击:(8)  评论:(0)  加入收藏
摘要已经使用了一段时间的Java,期间也了解和用过一些JVM(Java Virtual Machine)参数,但是没有仔细去整理过每个参数代表的意义,为此整理成文。Java使用方式java [options] clas...【详细内容】
2019-11-12   Java  点击:(9)  评论:(0)  加入收藏
不考虑多线程并发的情况下,容器类一般使用ArrayList、HashMap等线程不安全的类,效率更高。在并发场景下,常会用到ConcurrentHashMap、ArrayBlockingQueue等线程安全的容器类,虽...【详细内容】
2019-11-11   Java  点击:(11)  评论:(0)  加入收藏
Promise 是 CommonJS 中的规范,它能够帮助我们控制代码流程,避免函数的多层嵌套。现在 Web 前端异步编程越来越普遍,它的出现让异步编程变得更佳的容易理解。由于它越来越受到...【详细内容】
2019-11-11   Java  点击:(11)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条