【Jdbc/Metadata】借助Metadata获得表字段的设定细节


表定义:

create table emp516(
    id number(12),
    f1 nvarchar2(20),
    f2 varchar2(30),
    f3 number(10,2),
    f4 timestamp
)

程序:

package com.hy.lab.fieldproperty;

import java.sql.*;

/**
 * 此类用于获得某表的字段设定细节
 */
public class TableProber {
    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
            String user = "luna";
            String pass = "1234";
            conn = DriverManager.getConnection(url, user, pass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void main(String[] args) {
        String sql = "select * from emp516";

        try (Connection conn = getConnection();
             PreparedStatement stmt=conn.prepareStatement(sql)){
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetMetaData metaData = rs.getMetaData();
            // 获得所有列的数目及实际列数
            int columnCount = metaData.getColumnCount();
            System.out.println("查询结果共有:"+columnCount+"列。");

            for (int i = 1; i <= metaData.getColumnCount(); i++) {

                // 获得指定列的列名
                String columnName = metaData.getColumnName(i);
                // 获得指定列的列值
                int columnType = metaData.getColumnType(i);
                // 获得指定列的数据类型名
                String columnTypeName = metaData.getColumnTypeName(i);
                // 所在的Catalog名字
                String catalogName = metaData.getCatalogName(i);
                // 对应数据类型的类
                String columnClassName = metaData.getColumnClassName(i);
                // 在数据库中类型的最大字符个数
                int columnDisplaySize = metaData.getColumnDisplaySize(i);
                // 默认的列的标题
                String columnLabel = metaData.getColumnLabel(i);
                // 获得列的模式
                String schemaName = metaData.getSchemaName(i);
                // 某列类型的精确度(类型的长度)
                int precision = metaData.getPrecision(i);
                // 小数点后的位数
                int scale = metaData.getScale(i);
                // 获取某列对应的表名
                String tableName = metaData.getTableName(i);
                // 是否自动递增
                boolean isAutoInctement = metaData.isAutoIncrement(i);
                // 在数据库中是否为货币型
                boolean isCurrency = metaData.isCurrency(i);
                // 是否为空
                int isNullable = metaData.isNullable(i);
                // 是否为只读
                boolean isReadOnly = metaData.isReadOnly(i);
                // 能否出现在where中
                boolean isSearchable = metaData.isSearchable(i);
                //System.out.println(columnCount);
                System.out.println("第" + i + "列的字段名称:" + columnName);
                System.out.println("              SqlType中的编号:" + columnType);
                System.out.println("              数据类型名:" + columnTypeName);
                System.out.println("              所在的Catalog名字:" + catalogName);
                System.out.println("              对应数据类型的类:" + columnClassName);
                System.out.println("              在数据库中类型的最大字符个数:" + columnDisplaySize);
                System.out.println("              默认的列的标题:" + columnLabel);
                System.out.println("              模式:" + schemaName);
                System.out.println("              类型的长度(类型的精确度):" + precision);
                System.out.println("              小数点后位数:" + scale);
                System.out.println("              所在表名:" + tableName);
                System.out.println("              是否自动递增:" + isAutoInctement);
                System.out.println("              在数据库中是否为货币型:" + isCurrency);
                System.out.println("              是否为空:" + isNullable);
                System.out.println("              是否为只读:" + isReadOnly);
                System.out.println("              能否出现在where中:" + isSearchable);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

输出:

查询结果共有:5列。
第1列的字段名称:ID
              SqlType中的编号:2
              数据类型名:NUMBER
              所在的Catalog名字:
              对应数据类型的类:java.math.BigDecimal
              在数据库中类型的最大字符个数:13
              默认的列的标题:ID
              模式:
              类型的长度(类型的精确度):12
              小数点后位数:0
              所在表名:
              是否自动递增:false
              在数据库中是否为货币型:true
              是否为空:1
              是否为只读:false
              能否出现在where中:true
第2列的字段名称:F1
              SqlType中的编号:-9
              数据类型名:NVARCHAR2
              所在的Catalog名字:
              对应数据类型的类:java.lang.String
              在数据库中类型的最大字符个数:20
              默认的列的标题:F1
              模式:
              类型的长度(类型的精确度):20
              小数点后位数:0
              所在表名:
              是否自动递增:false
              在数据库中是否为货币型:false
              是否为空:1
              是否为只读:false
              能否出现在where中:true
第3列的字段名称:F2
              SqlType中的编号:12
              数据类型名:VARCHAR2
              所在的Catalog名字:
              对应数据类型的类:java.lang.String
              在数据库中类型的最大字符个数:30
              默认的列的标题:F2
              模式:
              类型的长度(类型的精确度):30
              小数点后位数:0
              所在表名:
              是否自动递增:false
              在数据库中是否为货币型:false
              是否为空:1
              是否为只读:false
              能否出现在where中:true
第4列的字段名称:F3
              SqlType中的编号:2
              数据类型名:NUMBER
              所在的Catalog名字:
              对应数据类型的类:java.math.BigDecimal
              在数据库中类型的最大字符个数:12
              默认的列的标题:F3
              模式:
              类型的长度(类型的精确度):10
              小数点后位数:2
              所在表名:
              是否自动递增:false
              在数据库中是否为货币型:true
              是否为空:1
              是否为只读:false
              能否出现在where中:true
第5列的字段名称:F4
              SqlType中的编号:93
              数据类型名:TIMESTAMP
              所在的Catalog名字:
              对应数据类型的类:oracle.sql.TIMESTAMP
              在数据库中类型的最大字符个数:11
              默认的列的标题:F4
              模式:
              类型的长度(类型的精确度):0
              小数点后位数:6
              所在表名:
              是否自动递增:false
              在数据库中是否为货币型:false
              是否为空:1
              是否为只读:false
              能否出现在where中:true

Process finished with exit code 0

END

相关