java 读取数据库中表定义

将数据库中的表信息读取出来

package com.cloud.smartreport.utils;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

import org.smart4j.framework.dao.DatabaseHelper;

public class DbToWord
{
    public static void main(String[] args)
    {
        
        try
        {
            Connection conn = DatabaseHelper.getConnection();
            DatabaseMetaData metadata = conn.getMetaData();
             System.out.println("数据库已知的用户: "+ metadata.getUserName());
             System.out.println("数据库的系统函数的逗号分隔列表: "+ metadata.getSystemFunctions());
             System.out.println("数据库的时间和日期函数的逗号分隔列表: "+ metadata.getTimeDateFunctions());
             System.out.println("数据库的字符串函数的逗号分隔列表: "+ metadata.getStringFunctions());
             System.out.println("数据库供应商用于 'schema' 的首选术语: "+ metadata.getSchemaTerm());
             System.out.println("数据库URL: " + metadata.getURL());
             System.out.println("是否允许只读:" + metadata.isReadOnly());
             System.out.println("数据库的产品名称:" + metadata.getDatabaseProductName());
             System.out.println("数据库的版本:" + metadata.getDatabaseProductVersion());
             System.out.println("驱动程序的名称:" + metadata.getDriverName());
             System.out.println("驱动程序的版本:" + metadata.getDriverVersion());
                           
             System.out.println();
             System.out.println("数据库中使用的表类型");
             ResultSet rs = metadata.getTableTypes();
             while (rs.next()) {
             System.out.println(rs.getString(1));
             }
             rs.close();
                           
             System.out.println();
            /**
             * 获取指定的数据库的所有表的类型,getTables()的第一个参数就是数据库名 因为与MySQL连接时没有指定,这里加上,剩下的参数就可以为null了
             * 第二个参数是模式名称的模式,但是输出也是什么都没有。谁知道告诉我一声
             */
            System.out.println("获取指定的数据库的所有表的类型");
            ResultSet rs1 = metadata.getTables("stock", null, null, null);
            while (rs1.next())
            {
                System.out.println();
                System.out.println("数据库名:" + rs1.getString(1));
                System.out.println("表名: " + rs1.getString(3));
                System.out.println("类型: " + rs1.getString(4));
                String tablename = rs1.getString(3);
                
                List<String> keyList = new ArrayList<String>();
                ResultSet rs3 = metadata.getPrimaryKeys("stock", null, tablename);
                while (rs3.next())
                {
                    keyList.add(rs3.getString(4));
                }
                rs3.close();
                
                PreparedStatement ps = conn.prepareStatement("select * from " + tablename);
                ResultSet rs2 = ps.executeQuery();
                ResultSetMetaData rsme = rs2.getMetaData();

                int columnCount = rsme.getColumnCount();
                //System.out.println("ResultSet对象中的列数" + columnCount);
                System.out.println("列定义  | 自动编号 | 是否为空  | 主键 ");
                for (int i = 1; i < columnCount; i++)
                {
                    System.out.print(rsme.getColumnName(i) + " " + rsme.getColumnTypeName(i) + "("
                        + rsme.getPrecision(i) + ")");
                    System.out.print("| " + rsme.isAutoIncrement(i));
                    System.out.print("| " + rsme.isNullable(i));
                    System.out.println("| "+ keyList.contains(rsme.getColumnName(i)));
                }
                System.out.println();
                rs2.close();
                ps.close();
                
            }
            rs1.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

 

输出结果:

 

数据库名:stock
表名: trd_daily_volume
类型: TABLE
列定义  | 自动编号 | 是否为空  | 主键 
id BIGINT(20)| true| 0| true
stock_code VARCHAR(6)| false| 0| true
trade_date DATETIME(19)| false| 1| false
trade_status INT(10)| false| 1| false
open_price DOUBLE(9)| false| 1| false
high_price DOUBLE(9)| false| 1| false
low_price DOUBLE(9)| false| 1| false
close_price DOUBLE(9)| false| 1| false
dnshr_trade BIGINT(12)| false| 1| false

  

 

posted @ 2016-05-12 11:11  panie2015  阅读(592)  评论(0编辑  收藏  举报