【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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)