代码下载: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文件的更多相关文章

  1. 【Java/JDBC】借助ResultSetMetaData,从数据库表中抽取字段信息存成Excel文件

    本例工程下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-3.rar 工作中曾有个为42张表建立测 ...

  2. c++获取sqlite3数据库表中所有字段的方法

    常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 方法1:使用s ...

  3. Mysql 导出数据库和指定表中的数据

    参考地址:http://jingyan.baidu.com/article/b7001fe14240ab0e7282dde9.html [root@youo zw]# mysqldump -u roo ...

  4. 数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)

    意:本篇文章仅适用于mysql和postgre这两种数据库 1.查询数据库中所有表名及对应表的详细信息 select * from INFORMATION_SCHEMA.tables 2.根据指定名称 ...

  5. 使用pandas中的raad_html函数爬取TOP500超级计算机表格数据并保存到csv文件和mysql数据库中

    参考链接:https://www.makcyun.top/web_scraping_withpython2.html #!/usr/bin/env python # -*- coding: utf-8 ...

  6. SqlServer中获取所有数据库,所有表,所有字段

    原文:SqlServer中获取所有数据库,所有表,所有字段 一.获取所有数据库 select * from master.dbo.SysDatabases 二.获取某个库中所有表 SELECT * F ...

  7. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  8. 使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库

    在表DBCON里维护一条记录,指向HANA数据库.con_ENV里填入HANA数据库的主机名和端口号.如vmXXXX:30015 DATA: ls_new TYPE DBCON. ls_new-con ...

  9. 一个利用pojo类从前端页面request中获取参数的小框架~

    写之前不知道Spring已经实现这样的功能,所以傻傻的写了这个东西! 实现原理挺有趣的在此记录一下.从去年十月参加java开发以来自己终于有了点小进步. 好开心. 解决问题(详解):前端form表单提 ...

随机推荐

  1. SpringDataJPA第二天讲义

    第1章     Spring Data JPA的概述 1.1    Spring Data JPA概述 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的 ...

  2. 【JavaWeb】通过邮件找回密码

    前言 本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路.整个实现过程中最重要的就是以下三点: 如何发送邮件到用户指定邮箱 邮件中的重置密码链接构成是怎么样的 验证重置密码链接的合法性(是否过 ...

  3. Thymeleaf整合到Spring Security,标签sec不起作用

    将 pom 文件中的 thymeleaf-extras-springsecurity4 依赖改成  thymeleaf-extras-springsecurity5 <dependency> ...

  4. PAT Basic 1080 MOOC期终成绩 (25 分)

    对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评获得不少于60分( ...

  5. 个人推荐-几款好用的App

    前言 在使用智能手机的过程中比较喜欢尝试一些新奇好玩的app,同时也积攒下了不少个人认为很有帮助或很有特点的app,写这篇随笔当做一个记录吧. 便签-小周便签 一款功能十分强大的便签app,在编辑界面 ...

  6. java之spring

    Spring Spring中的基本概念1.IOC/DI对象的属性由自己创建,为正向流程,而由Spring创建,为控制反转.DI(依赖注入)为实现IOC的一种方式,通过配置文件或注解包含的依赖关系创建与 ...

  7. PAT乙级1044

    题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696 题解 需要注意的几个点: 题目有指 ...

  8. .gitignore文件不起作用,怎么处理?

    遇到这么个场景,项目之前没有.gitignore文件,新建的.gitignore文件中已经标明忽略的文件目录下的文件,但是git push上去忽略的文件还是在push的目录中.查阅资料了解到 在git ...

  9. selenium web driver

    WebDriver 支持的浏览器 IE6-10 FireFox大部分版本 Chrome Safari Opera Andrioid 系统上的自带浏览器 IOS系统上自带浏览器 HtmlUnit的无界面 ...

  10. Vue项目搭建流程

    记录一下vue项目的搭建流程. 1.安装node.npm 下载地址为:https://nodejs.org/en/ 设置环境变量,命令行分别输入: node -v   npm -v  查看安装是否成功 ...