新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  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   点击:()  评论:()
声明:本站部分内容来自互联网,如有任何版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
一、先做一张简单的网页。 二、加上相应的javacript代码。 三、开始测试,判断输入框内的是否是6位数字。 四、判断输入框内为正整数,而不是负数。 五、判断身份证位数吧...【详细内容】
2019-06-14 javascript  点击:(1)  评论:(0)  加入收藏
在最近的项目中碰到一个数据源的配置需求,就是需要配置公司所有系统的数据库、表等信息,其中大数据部门抽数时需要过滤某些表的敏感字段,如身份证号、手机号等敏感字段。需要后...【详细内容】
2019-06-11 Java  点击:(7)  评论:(0)  加入收藏
前言什么是 V8?JavaScript运行的背后发生了什么?如果你是一个 JS 开发者或者是正在学习这门语言的学生,很大概率上你会遇到双字母词”V8”。在这篇文章中,我将会为你简述不同的...【详细内容】
2019-06-05 JavaScript  点击:(5)  评论:(0)  加入收藏
一、排序 冒泡排序//冒泡排序function bubbleSort(arr) { for(var i = 1, len = arr.length; i < len - 1; ++i) { for(var j = 0; j <= len - i; ++j) { if (arr[j] > arr[...【详细内容】
2019-05-17 JavaScript, js  点击:(9)  评论:(0)  加入收藏
JavaScript 引用类型所谓引用类型,在ECMAScript中表示一种数据结构,其中有一些数据和方法,在其他语言中大多被称为类,但是在这里我们一般不这样称呼。即使ECMAScript是一门面...【详细内容】
2019-05-15 JavaScript, js  点击:(8)  评论:(0)  加入收藏
一 命名规则1)包: 命名应该都是名词或名词性词组,全部小写,单词之间用“.”分开,一般使用本公司网站域名的逆序后跟具体的软件内部模块名包命名举例: package com.sun.java; packag...【详细内容】
2019-05-09 Java  点击:(10)  评论:(0)  加入收藏
1.引用的基本概念强引用:当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了。如果一个对象具有强引用,JVM就不会去...【详细内容】
2019-05-09 Java  点击:(16)  评论:(0)  加入收藏
前言可能你会很熟练,但名称不一定知道。正文从这开始~~ 让我们谈谈什么是:lambdas(匿名函数)、 first-class functions(头等函数)、higher-order functions(高阶函数)、unary functi...【详细内容】
2019-05-08 JavaScript, js  点击:(9)  评论:(0)  加入收藏
前言何为技巧,意指表现在文学、工艺、体育等方面的巧妙技能。代码作为一门现代高级工艺,推动着人类科学技术的发展,同时犹如文字一样承托着人类文化的进步。每写好一篇文章,都...【详细内容】
2019-05-08 JavaScript, js  点击:(6)  评论:(0)  加入收藏
这篇文章主要记录一下平时自己实践得到的, 博客中学习的以及在一些项目源码中看到的 javascript 技巧。有些东西可以说是奇淫技巧,有些可能是 ES6+ 中一些比较具有实用性的...【详细内容】
2019-05-05 JavaScript, js  点击:(6)  评论:(0)  加入收藏
说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其...【详细内容】
2019-05-05 Java,MySQL  点击:(10)  评论:(0)  加入收藏
Javascript的历史来源94年网景公司 研发出世界上第一款浏览器。95年 sun公司 java语言诞生网景公司和sun合作。Javascript ===> javascriptJavaScript和ECMAScript的关系简...【详细内容】
2019-04-30   点击:(12)  评论:(0)  加入收藏
用任何编程语言来开发程序,都是为了让计算机干活,比如编写一篇文章,下载一首MP3等,而计算机干活的CPU只认识机器的指令,所以,尽管不同的编程语言差异极大,最后都得“翻译”成CPU可以执行的机器指令。理论上任何语言干任何事...【详细内容】
2019-04-17   点击:(7)  评论:(0)  加入收藏
推荐资讯
相关文章
栏目更新
栏目热门
'); })();