【Java/JDBC】利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件
代码下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-2.rar
这篇还不够完善,请看更完善的续篇 https://www.cnblogs.com/xiandedanteng/p/11783796.html
本例主要使用的是JDBC提供的ResultSetMetaData类去取表的相关信息,文中只取了四种,其它信息大家可以查看这个类的方法而得知。
JavaCode:
package com.hy;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
class Field{
String name; // 列名
int size; // 列容量
String type; // 列数据类型
boolean allowNull;// 列是否允許为空
}
/**
* 利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件
* @author horn1
*
*/
public class ColumnSeeker {
private static Logger log = Logger.getLogger(ColumnSeeker.class);
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://192.168.161.130:3306/test";
private static final String USER = "root";
private static final String PSWD = "12345678";
private List<Field> fields;
/**
* 从DB里取字段
* @param tablename
* @return
*/
public List<Field> fetchAllColumns(String tablename){
fields=new ArrayList<Field>();
Connection conn = null;
Statement stmt = null;
try {
Class.forName(JDBC_DRIVER).newInstance();
conn = DriverManager.getConnection(DB_URL, USER, PSWD);
stmt = conn.createStatement();
String sql = "select * from emp order by id limit 1";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData rsMetadata = rs.getMetaData();
while (rs.next()) {
int count = rsMetadata.getColumnCount();
for (int i=1; i<count+1; i++) {
// 列名
String columnName = rsMetadata.getColumnLabel(i);
// 列容量
int size =rsMetadata.getColumnDisplaySize(i);
// 列数据类型
String columnType = rsMetadata.getColumnTypeName(i);
// 列是否允許为空
boolean allowNull=(rsMetadata.isNullable(i)!=0);
/*String raw = "columnName={0},size={1},columnType={2},allowNull={3}";
Object[] arr = { columnName, size, columnType,allowNull};
String outStr = MessageFormat.format(raw, arr);
log.info(outStr);*/
Field f=new Field();
f.name=columnName;
f.size=size;
f.type=columnType;
f.allowNull=allowNull;
fields.add(f);
}
}
rs.close();
} catch (Exception e) {
System.out.print("DB/SQL ERROR:" + e.getMessage());
} finally {
try {
stmt.close();
conn.close();
} catch (SQLException e) {
System.out.print("Can't close stmt/conn because of " + e.getMessage());
}
}
return fields;
}
/**
* 打印全部字段
*/
public void printFields() {
for(Field f:fields) {
String raw = "column name={0},size={1},type={2},allowNull={3}";
Object[] arr = { f.name, f.size, f.type,f.allowNull};
String outStr = MessageFormat.format(raw, arr);
//log.info(outStr);
}
}
/**
* 输出全部列到csv文件
* @param csvFilename
* @return
*/
public boolean saveAllToCsv(String csvFilename) {
try {
FileWriter fileWriter = new FileWriter(new File(csvFilename), true);
List<String> allowNulls=new ArrayList<String>();
List<String> allowType=new ArrayList<String>();
List<String> allowSize=new ArrayList<String>();
List<String> allowName=new ArrayList<String>();
for(Field f:fields) {
allowNulls.add(String.valueOf(f.allowNull));
allowType.add(f.type);
allowSize.add(String.valueOf(f.size));
allowName.add(f.name);
}
String line="";
line =String.join(",", allowSize)+ System.getProperty("line.separator");
fileWriter.write(line);
line =String.join(",", allowType)+ System.getProperty("line.separator");
fileWriter.write(line);
line =String.join(",", allowNulls)+ System.getProperty("line.separator");
fileWriter.write(line);
line =String.join(",", allowName)+ System.getProperty("line.separator");
fileWriter.write(line);
fileWriter.flush();
fileWriter.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 仅将非空列输出到CSV
* @param csvFilename
* @return
*/
public boolean saveNotnullToCsv(String csvFilename) {
try {
FileWriter fileWriter = new FileWriter(new File(csvFilename), true);
List<String> allowNulls=new ArrayList<String>();
List<String> allowType=new ArrayList<String>();
List<String> allowSize=new ArrayList<String>();
List<String> allowName=new ArrayList<String>();
for(Field f:fields) {
if(f.allowNull==false) {
allowNulls.add(String.valueOf(f.allowNull));
allowType.add(f.type);
allowSize.add(String.valueOf(f.size));
allowName.add(f.name);
}
}
String line="";
line =String.join(",", allowSize)+ System.getProperty("line.separator");
fileWriter.write(line);
line =String.join(",", allowType)+ System.getProperty("line.separator");
fileWriter.write(line);
line =String.join(",", allowNulls)+ System.getProperty("line.separator");
fileWriter.write(line);
line =String.join(",", allowName)+ System.getProperty("line.separator");
fileWriter.write(line);
fileWriter.flush();
fileWriter.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public static void main(String[] args) {
ColumnSeeker cs=new ColumnSeeker();
cs.fetchAllColumns("emp");
cs.printFields();
cs.saveAllToCsv("d:\\all.csv");
cs.saveNotnullToCsv("d:\\notnulls.csv");
log.info("Completed");
}
}
输出的CSV文件截图:


--END-- 2019年11月2日11:05:53
【Java/JDBC】利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件的更多相关文章
- 【Java/JDBC】借助ResultSetMetaData,从数据库表中抽取字段信息存成Excel文件
本例工程下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-3.rar 工作中曾有个为42张表建立测 ...
- c++获取sqlite3数据库表中所有字段的方法
常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 方法1:使用s ...
- Mysql 导出数据库和指定表中的数据
参考地址:http://jingyan.baidu.com/article/b7001fe14240ab0e7282dde9.html [root@youo zw]# mysqldump -u roo ...
- 数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)
意:本篇文章仅适用于mysql和postgre这两种数据库 1.查询数据库中所有表名及对应表的详细信息 select * from INFORMATION_SCHEMA.tables 2.根据指定名称 ...
- 使用pandas中的raad_html函数爬取TOP500超级计算机表格数据并保存到csv文件和mysql数据库中
参考链接:https://www.makcyun.top/web_scraping_withpython2.html #!/usr/bin/env python # -*- coding: utf-8 ...
- SqlServer中获取所有数据库,所有表,所有字段
原文:SqlServer中获取所有数据库,所有表,所有字段 一.获取所有数据库 select * from master.dbo.SysDatabases 二.获取某个库中所有表 SELECT * F ...
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- 使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库
在表DBCON里维护一条记录,指向HANA数据库.con_ENV里填入HANA数据库的主机名和端口号.如vmXXXX:30015 DATA: ls_new TYPE DBCON. ls_new-con ...
- 一个利用pojo类从前端页面request中获取参数的小框架~
写之前不知道Spring已经实现这样的功能,所以傻傻的写了这个东西! 实现原理挺有趣的在此记录一下.从去年十月参加java开发以来自己终于有了点小进步. 好开心. 解决问题(详解):前端form表单提 ...
随机推荐
- extern c 解释
extern "C"修饰的变量和函数是按照c的方式编译的 如果想用c++方式编译c代码,需要特殊标识 方法 #if defined(__cplusplus) || defined( ...
- JS 百度地图 换地图主题颜色(API自带)
JS 百度地图 换地图主题颜色(API自带) <script type="text/javascript" src="http://api.map.baidu.co ...
- SpringCloud之Zuul网关原理及其配置
Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...
- python Beautiful Soup 采集it books pdf,免费下载
http://www.allitebooks.org/ 是我见过最良心的网站,所有书籍免费下载 周末无聊,尝试采集此站所有Pdf书籍. 采用技术 python3.5 Beautiful soup 分享 ...
- myeclipse 添加反编译插件
文件下载地址: 链接: https://pan.baidu.com/s/1th2goaA2aS45kO84dX1Bdg 密码: g1fu 先关闭myeclipse1.下载jad1.5.8g 下载后解压 ...
- import的本质
import本质? 1定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能,本质上是一个.py结尾的python文件)(文件:text.py 对应的模块名:text) 包 ...
- 【2017-12-06】winfrom 窗体自启最大化,控件自适应
先将窗体windowstate属性设置为Maximized public partial class Form1 : Form { public Form1() { InitializeCompone ...
- 手写KMeans算法
KMeans算法是一种无监督学习,它会将相似的对象归到同一类中. 其基本思想是: 1.随机计算k个类中心作为起始点. 将数据点分配到理其最近的类中心. 3.移动类中心. 4.重复2,3直至类中心不再改 ...
- 好吧,关于nginx
今天在看关于nginx的文章,自己也动手试了一下. 我是在本地测试的,在IIS上面绑了两个网站,端口号不同.当我把IIS配置好以后,修改了nginx的conf文件. nginx配置: nginx配置好 ...
- 大数据之路week03--day05(线程 I)
真的,身体这个东西一定要爱护好,难受的时候电脑都不想去碰,尤其是胃和肾... 这两天耽误了太多时间,今天好转了立刻学习,即刻不能耽误!. 话不多说,说正事: 1.多线程(理解) (1)多线程:一个应用 ...