JDBC中DatabaseMetaData用法

JDBC中DatabaseMetaData用法DatabaseMetaData类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息。就如我们上面例子中所显示的几个信息[其他的方法请读者参考JDKAPI中的DatabaseMetaData类]:getURL()返回一个String类对象,代表数据库的URL。getUserName()返回连接当前数据库管理系统的用户名。isReadOnly(…

大家好,又见面了,我是你们的朋友全栈君。

DatabaseMetaData类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息。就如我们上面例子中所显示的几个信息[其他的方法请读者参考JDK API中的DatabaseMetaData类]:

getURL()

返回一个String类对象,代表数据库的URL。

getUserName()

返回连接当前数据库管理系统的用户名。

isReadOnly()

返回一个boolean值,指示数据库是否只允许读操作。

getDatabaseProductName()

返回数据库的产品名称。

getDatabaseProductVersion()

返回数据库的版本号。

getDriverName()

返回驱动驱动程序的名称。

getDriverVersion()

返回驱动程序的版本号。


一、获取数据库表信息
getTables
ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException
检索可在给定类别中使用的表的描述。仅返回与类别、模式、表名称和类型标准匹配的表描述。它们根据 TABLE_TYPE、TABLE_SCHEM 和 TABLE_NAME 进行排序。
每个表描述都有以下列:

TABLE_CAT String => 表类别(可为 null)
TABLE_SCHEM String => 表模式(可为 null)
TABLE_NAME String => 表名称
TABLE_TYPE String => 表类型。典型的类型是 “TABLE”、”VIEW”、”SYSTEM TABLE”、”GLOBAL TEMPORARY”、”LOCAL TEMPORARY”、”ALIAS” 和 “SYNONYM”。
REMARKS String => 表的解释性注释
TYPE_CAT String => 类型的类别(可为 null)
TYPE_SCHEM String => 类型模式(可为 null)
TYPE_NAME String => 类型名称(可为 null)
SELF_REFERENCING_COL_NAME String => 有类型表的指定 “identifier” 列的名称(可为null)
REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中创建值的方式。这些值为 “SYSTEM”、”USER” 和 “DERIVED”。(可能为null)
注: 有些数据库可能不返回用于所有表的信息。

参数:
catalog – 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 “” 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围
schemaPattern – 模式名称的模式,因为存储在数据库中,所以它必须匹配模式名称。该参数为 “” 则检索那些没有模式的描述,为null 则表示该模式名称不应用于缩小搜索范围
tableNamePattern – 表名称模式,因为存储在数据库中,所以它必须匹配表名称
types – 要包括的表类型组成的列表,null 表示返回所有类型
返回:
ResultSet – 每一行都是一个表描述
抛出:
SQLException – 如果发生数据库访问错误


二、获取表中列信息

getColumns
ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException

检索可在指定类别中使用的表列的描述。

仅返回与类别、模式、表和列名称标准匹配的列描述。它们根据 TABLE_SCHEM、TABLE_NAME 和ORDINAL_POSITION 进行排序。

每个列描述都有以下列:

TABLE_CAT String => 表类别(可为 null)
TABLE_SCHEM String => 表模式(可为 null)
TABLE_NAME String => 表名称
COLUMN_NAME String => 列名称
DATA_TYPE int => 来自 java.sql.Types 的 SQL 类型
TYPE_NAME String => 数据源依赖的类型名称,对于 UDT,该类型名称是完全限定的
COLUMN_SIZE int => 列的大小。对于 char 或 date 类型,列的大小是最大字符数,对于 numeric 和 decimal 类型,列的大小就是精度。
BUFFER_LENGTH 未被使用。
DECIMAL_DIGITS int => 小数部分的位数
NUM_PREC_RADIX int => 基数(通常为 10 或 2)
NULLABLE int => 是否允许使用 NULL。
columnNoNulls – 可能不允许使用 NULL 值
columnNullable – 明确允许使用 NULL 值
columnNullableUnknown – 不知道是否可使用 null
REMARKS String => 描述列的注释(可为 null)
COLUMN_DEF String => 默认值(可为 null)
SQL_DATA_TYPE int => 未使用
SQL_DATETIME_SUB int => 未使用
CHAR_OCTET_LENGTH int => 对于 char 类型,该长度是列中的最大字节数
ORDINAL_POSITION int => 表中的列的索引(从 1 开始)
IS_NULLABLE String => “NO” 表示明确不允许列使用 NULL 值,”YES” 表示可能允许列使用 NULL 值。空字符串表示没人知道是否允许使用 null 值。
SCOPE_CATLOG String => 表的类别,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
SCOPE_SCHEMA String => 表的模式,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为null)
SCOPE_TABLE String => 表名称,它是引用属性的作用域(如果 DATA_TYPE 不是 REF,则为 null)
SOURCE_DATA_TYPE short => 不同类型或用户生成 Ref 类型、来自 java.sql.Types 的 SQL 类型的源类型(如果 DATA_TYPE 不是 DISTINCT 或用户生成的 REF,则为null)
参数:
catalog – 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 “” 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围
schemaPattern – 模式名称的模式,因为存储在数据库中,所以它必须匹配模式名称。该参数为 “” 则检索那些没有模式的描述,为null 则表示该模式名称不应用于缩小搜索范围
tableNamePattern – 表名称模式,因为存储在数据库中,所以它必须匹配表名称
columnNamePattern – 列名称模式,因为存储在数据库中,所以它必须匹配列名称
返回:
ResultSet – 每一行都是一个列描述
抛出:
SQLException – 如果发生数据库访问错误
另请参见:
getSearchStringEscape()


三、表中主键信息

getPrimaryKeys
ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException
检索对给定表的主键列的描述。它们根据 COLUMN_NAME 进行排序。

每个主键列描述都有以下列:

TABLE_CAT String => 表类别(可为 null)
TABLE_SCHEM String => 表模式(可为 null)
TABLE_NAME String => 表名称
COLUMN_NAME String => 列名称
KEY_SEQ short => 主键中的序列号
PK_NAME String => 主键的名称(可为 null)
参数:
catalog – 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 “” 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围
schema – 模式名称,因为存储在数据库中,所以它必须匹配模式名称。该参数为 “” 则检索那些没有模式的描述,为 null 则表示该模式名称不应用于缩小搜索范围
table – 表名称,因为存储在数据库中,所以它必须匹配表名称
返回:
ResultSet – 每一行都是一个主键列描述
抛出:
SQLException – 如果发生数据库访问错误

public static void main(String[] args) {   
//这里没有指定数据库   
String url = "jdbc:mysql://127.0.0.1:3306/"; 
String user = "root"; 
String pass = ""; 
try {   
Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection conn = DriverManager.getConnection(url, user, pass); 
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("ssi2bbs", 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)); 
}   
rs1.close(); 
System.out.println(); 
System.out.println("获取指定的数据库的表的主键"); 
//获取指定的数据库的表的主键,第二个参数也是模式名称的模式,使用null了   
ResultSet rs2 = metadata.getPrimaryKeys("mysql", null, "db"); 
while (rs2.next()) {   
System.out.println("主键名称: "+ rs2.getString(4)); 
}   
rs2.close(); 
System.out.println(); 
System.out.println("DatabaseMetaData.getIndexInfo()方法返回信息:"); 
ResultSet rs3 = metadata.getIndexInfo("ssi2bbs", null, "user", false, true); 
while (rs3.next()) {   
System.out.println("数据库名: "+ rs3.getString(1)); 
System.out.println("表模式: "+ rs3.getString(2)); 
System.out.println("表名称: "+ rs3.getString(3)); 
System.out.println("索引值是否可以不唯一: "+ rs3.getString(4)); 
System.out.println("索引类别: "+ rs3.getString(5)); 
System.out.println("索引名称: "+ rs3.getString(6)); 
System.out.println("索引类型: "+ rs3.getString(7)); 
System.out.println("索引中的列序列号: "+ rs3.getString(8)); 
System.out.println("列名称: "+ rs3.getString(9)); 
System.out.println("列排序序列: "+ rs3.getString(10)); 
System.out.println("TYPE为 tableIndexStatistic时它是表中的行数否则它是索引中唯一值的数量: "+ rs3.getString(11)); 
System.out.println("TYPE为 tableIndexStatisic时它是用于表的页数否则它是用于当前索引的页数: "+ rs3.getString(12)); 
System.out.println("过滤器条件: "+ rs3.getString(13)); 
}   
rs3.close(); 
} catch (Exception e) {   
e.printStackTrace(); 
}   
}  

ResultSetMetaData接口, 用于获取关于ResultSet 对象中列的类型和属性信息的对象。下面的代码是把一个表的列信息打印了出来。当然了,这只是一部分。详细的参考JAVA JDK。

Java代码
public static void main(String[] args) {   
try {   
Class.forName("com.mysql.jdbc.Driver").newInstance(); 
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ssi2bbs","root",""); 
PreparedStatement ps = conn.prepareStatement("select * from bbs"); 
ResultSet rs = ps.executeQuery(); 
ResultSetMetaData rsme = rs.getMetaData(); 
int columnCount = rsme.getColumnCount(); 
System.out.println("ResultSet对象中的列数"+ columnCount); 
for (int i = 1; i < columnCount ; i++) { 
System.out.println(); 
System.out.println("列名称: "+ rsme.getColumnName(i)); 
System.out.println("列类型(DB): " + rsme.getColumnTypeName(i)); 
System.out.println("长度: "+ rsme.getPrecision(i) ); 
System.out.println("是否自动编号: "+ rsme.isAutoIncrement(i)); 
System.out.println("是否可以为空: "+ rsme.isNullable(i)); 
System.out.println("是否可以写入: "+ rsme.isReadOnly(i)); 
}   
} catch (Exception e) {   
e.printStackTrace(); 
}   
}  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150965.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 中国移动套餐价格表_Cdma2000

    中国移动套餐价格表_Cdma2000来源:知乎链接:https://www.zhihu.com/question/20388677/answer/14986172中国移动:GSM、TD-SCDMA中国联通:GSM、WCDMA中国电信:CDMA、CDMA2000GSM:也就是我们常说的2G模式,属于第2代蜂窝移动通信技术,其使用频率在800MHz~1800MHz左右。因为2G时代的中国移动和中国

  • [深入研究4G/5G/6G专题-11]: 测试-高通QXDM 、QCAT与空口协议验证总体测试架构与测试步骤「建议收藏」

    [深入研究4G/5G/6G专题-11]: 测试-高通QXDM 、QCAT与空口协议验证总体测试架构与测试步骤「建议收藏」作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址:https://blog.csdn.net/HiWangWenBing/article/details/124306527目录前言:第1步:硬件连接与网络配置1.1网络连接与测试架构1.2硬件连接与网络配置第2步:CPEWeb主要功能配置2.0http登录2.1获取设备状态信息2.2设置扫描频段(与基站的频段一致,避免其他干扰消息)2.3使能Radio

  • idea2021.5.3永久激活码[在线序列号]

    idea2021.5.3永久激活码[在线序列号],https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • python字典详解_python字典取值

    python字典详解_python字典取值字典字典的key和value一一对应的,字典是可变的,也是有序的(python3.6版本开始字典有序),可迭代的增加元素当key不存在时,直接赋值a={"status"

  • clientHeight、scrollHeight、offsetHeight和scrollTop之间区别[通俗易懂]

    clientHeight、scrollHeight、offsetHeight和scrollTop之间区别[通俗易懂]屏幕可见区域高(内容的可视高度,不包括边框,边距或滚动条):document.body.clientHeight正文内容高(整个元素的高度,包括带滚动条的隐蔽的地方):document.body.scrollHeight内容高+padding+边框:document.body.offsetHeight滚动条已经滚动的高度:document.body.scrollTop屏幕分辨率高:

  • Python open函数详解「建议收藏」

    Python open函数详解「建议收藏」演示环境,操作系统:Win1021H2(64bit);Python解释器:3.8.10。open是Python的一个内置函数,一般用于本地文件的读写操作。用法如下。my_file=open(file,mode,buffering,encoding,errors,newline,closefd,opener)#打开文件…#读写操作。省略my_file.colse()#释放文件open函数必须搭配.close()方法使用,先用open打开文件,然后进行读写操

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号