JDBC规范六-DatabaseMetaData详解
yuyutoo 2024-10-12 00:47 7 浏览 0 评论
DatabaseMetaData接口是由JDBC驱动程序实现的,用于提供底层数据源相关的信息。该接口主要用于为应用程序或工具确定如何与底层数据源交互。应用程序也可以使用DatabaseMetaData接口提供的方法获取数据源信息。
DatabaseMetaData接口中包含超过150个方法,根据这些方法的类型可以分为以下几类:
(1)获取数据源信息。
(2)确定数据源是否支持某一特性或功能。
(3)获取数据源的限制。
(4)确定数据源包含哪些SQL对象以及这些对象的属性。
(5)获取数据源对事务的支持。
DatabaseMetaData接口中有超过40个字段,这些字段都是常量,用于DatabaseMetaData接口中各个方法的返回值。
后面将会简单地介绍DatabaseMetaData接口,列举DatabaseMetaData各种类型的方法作用。关于DatabaseMetaData接口更详细的信息可参考JDBC规范文档。
1.创建DatabaseMetaData对象
DatabaseMetaData对象的创建比较简单,需要依赖Connection对象。Connection对象中提供了一个getMetadata()方法,用于创建DatabaseMetaData对象。
一旦创建了DatabaseMetaData对象,我们就可以通过该对象动态地获取数据源相关的信息了。下面是创建DatabaseMetaData对象并使用该对象获取数据库表名允许的最大字符数的案例,代码如下:
// 获取Connection对象
Connection connection = DriverManager.getConnection("jdbc:mysql://39.101.195.157:3306/jiudianyuyue?useUnicode=true&characterEncoding=utf-8&useSSL=false&tinyInt1isBit=false",
"root", "123456");
DatabaseMetaData dmd = connection.getMetaData();
2.获取数据源的基本信息
DatabaseMetaData接口中提供了一些方法,用于获取数据源的基本信息,例如URL、用户名等。这些方法如下。
getURL():获取数据库URL。
getUserName():获取数据库已知的用户。
getDatabaseProductName():获取数据库产品名。
getDatabaseProductVersion():获取数据库产品的版本。
getDriverMajorVersion():获取驱动主版本。
getDriverMinorVersion():获取驱动副版本。
getSchemaTerm():获取数据库供应商用于Schema的首选术语。
getCatalogTerm():获取数据库供应商用于Catalog的首选术语。
getProcedureTerm():获取数据库供应商用于Procedure的首选术语。
nullsAreSortedHigh():获取null值是否高排序。
nullsAreSortedLow():获取null值是否低排序。
usesLocalFiles():获取数据库是否将表存储在本地文件中。
usesLocalFilePerTable():获取数据库是否为每个表使用一个文件。
getSQLKeywords():获取数据库SQL关键字。下面是这些方法的使用案例,代码如下:
@Test
public void testDbMetaData() {
try {
Class.forName("com.mysql.jdbc.Driver");
// 获取Connection对象
Connection connection = DriverManager.getConnection("jdbc:mysql://39.101.195.157:3306/jiudianyuyue?useUnicode=true&characterEncoding=utf-8&useSSL=false&tinyInt1isBit=false",
"root", "123456");
DatabaseMetaData dmd = connection.getMetaData();
System.out.println("数据库URL:" + dmd.getURL());
System.out.println("数据库用户名:" + dmd.getUserName());
System.out.println("数据库产品名:" + dmd.getDatabaseProductName());
System.out.println("数据库产品版本:" + dmd.getDatabaseProductVersion());
System.out.println("驱动主版本:" + dmd.getDriverMajorVersion());
System.out.println("驱动副版本:" + dmd.getDriverMinorVersion());
System.out.println("数据库供应商用于schema的首选术语:" + dmd.getSchemaTerm());
System.out.println("数据库供应商用于catalog的首选术语:" + dmd.getCatalogTerm());
System.out.println("数据库供应商用于procedure的首选术语:" + dmd.getProcedureTerm());
System.out.println("null值是否高排序:" + dmd.nullsAreSortedHigh());
System.out.println("null值是否低排序:" + dmd.nullsAreSortedLow());
System.out.println("数据库是否将表存储在本地文件中:" + dmd.usesLocalFiles());
System.out.println("数据库是否为每个表使用一个文件:" + dmd.usesLocalFilePerTable());
System.out.println("ResultSet类型:" + dmd.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE));
System.out.println("ResultSet并行性:" + dmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE));
System.out.println("数据库SQL关键字:" + dmd.getSQLKeywords());
System.out.println("事务中的保存点:" + dmd.supportsSavepoints());
IOUtils.closeQuietly(connection);
} catch (Exception e) {
e.printStackTrace();
}
}
注意,由于HSQLDB驱动对DatabaseMetaData接口的getSQLKeywords()方法没有任何实现逻辑,只返回一个空字符串,因此上面的代码获取数据库SQL关键字内容为空。
3.获取数据源支持特性
DatabaseMetaData接口中提供了大量的方法用于确定数据源是否支持某个或一组特定的特性。除此之外,有些方法用于描述数据源对某一特性的支持级别。例如,下面一些方法用于判断数据源是否支持某些特性。
supportsAlterTableWithDropColumn():检索此数据源是否支持带有删除列的ALTER TABLE语句。
supportsBatchUpdates():检索此数据源是否支持批量更新。
supportsTableCorrelationNames():检索此数据源是否支持表相关名称。
supportsPositionedDelete():检索此数据源是否支持定位的DELETE语句。
supportsFullOuterJoins():检索此数据源是否支持完整地嵌套外部连接。
supportsStoredProcedures():检索此数据源是否存储过程。
supportsMixedCaseQuotedIdentifiers():检索此数据源是否将用双引号引起来的大小写混合的SQL标识符视为区分大小写,并以混合大小写方式存储它们。
下面的方法用于判断数据库对某些特性支持的级别。
supportsANSI92EntryLevelSQL():检索此数据源是否支持ANSI92入门级SQL语法。supportsCoreSQLGrammar():检索此数据源是否支持ODBC核心SQL语法。
DatabaseMetaData接口中判断数据源特性的方法较多,这里就不一一介绍了,读者需要时可参考JDBC API文档。
4.获取数据源限制
DatabaseMetaData接口中有一组方法用于获取数据源限制,下面列出其中的一些方法。
getMaxRowSize():获取最大行数。
getMaxStatementLength():获取此数据库在SQL语句中允许的最大字符数。
getMaxTablesInSelect():获取此数据库在SELECT语句中允许的最大表数。
getMaxConnections():获取此数据库支持的最大连接数。
getMaxCharLiteralLength():获取数据库支持的字符串字面量长度。
getMaxColumnsInTable():获取数据库表中允许的最大列数。这些方法返回值为int类型,当返回值为0时,表示没有限制或限制未知。
5.获取SQL对象及属性
DatabaseMetaData接口中的一些方法用于获取数据源有关SQL对象的信息,还提供了一些方法获取这些对象的属性信息。这些方法包括:
getSchemas():获取Schema信息。
getCatalogs():获取Catalog信息。
getTables():获取表信息。
getPrimaryKeys():获取主键信息。
getProcedures():获取存储过程信息。
getProcedureColumns():获取给定类别的存储过程参数和结果列的信息。
getUDTs():获取用户自定义数据类型。
getFunctions():获取函数信息。
getFunctionColumns():获取给定类别的函数参数和结果列的信息。
这些方法的返回值是一个ResultSet对象。该ResultSet对象的类型为TYPE_FORWARD_ONLY,并行性为CONCUR_READ_ONLY。可以调用ResultSet对象的getHoldability()方法获取ResultSet对象的可保持性。
6.获取事务支持
DatabaseMetaData还提供了一些方法用于判断数据源对事务的支持,主要包括:supportsTransactionIsolationLevel(int level):是否支持某一事务隔离级别。
supportsTransactions():是否支持事务。
getDefaultTransactionIsolation():获取默认的事务隔离级别。
supportsMultipleTransactions():是否支持同时开启多个事务。
相关推荐
- Python操作Word文档神器:python-docx库从入门到精通
-
Python操作Word文档神器:python-docx库从入门到精通动动小手,点击关注...
- Python 函数调用从入门到精通:超详细定义解析与实战指南 附案例
-
一、函数基础:定义与调用的核心逻辑定义:函数是将重复或相关的代码块封装成可复用的单元,通过函数名和参数实现特定功能。它是Python模块化编程的基础,能提高代码复用性和可读性。定义语法:...
- 等这么长时间Python背记手册终于来了,入门到精通(视频400集)
-
本文毫无套路!真诚分享!前言:无论是学习任何一门语言,基础知识一定要扎实,基础功非常的重要,找一个有丰富编程经验的老师或者师兄带着你会少走很多弯路,你的进步速度也会快很多,无论我们学习的目的是什么,...
- 图解Python编程:从入门到精通系列教程(附全套速查表)
-
引言本系列教程展开讲解Python编程语言,Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,它也是互联网最热门的编程语言之一。Python生态丰富,库(模块)极其丰富,这使...
- Python入门教程(非常详细)从零基础入门到精通,看完这一篇就够
-
本书是Python经典实例解析,采用基于实例的方法编写,每个实例都会解决具体的问题和难题。主要内容有:数字、字符串和元组,语句与语法,函数定义,列表、集、字典,用户输入和输出等内置数据结构,类和对象,...
- Python函数全解析:从入门到精通,一文搞定!
-
1.为什么要用函数?函数的作用:封装代码,提高复用性,减少重复,提高可读性。...
- Python中的单例模式:从入门到精通
-
Python中的单例模式:从入门到精通引言单例模式是一种常用的软件设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁创建和销毁的对象,比如日志对象、线程池、缓存等...
- 【Python王者归来】手把手教你,Python从入门到精通!
-
用800个程序实例、5万行代码手把手教你,Python从入门到精通!...
- Python从零基础入门到精通:一个月就够了
-
如果想从零基础到入门,能够全职学习(自学),那么一个月足够了。...
- Python 从入门到精通:一个月就够了
-
要知道,一个月是一段很长的时间。如果每天坚持用6-7小时来做一件事,你会有意想不到的收获。作为初学者,第一个月的月目标应该是这样的:熟悉基本概念(变量,条件,列表,循环,函数)练习超过30个编...
- Python零基础到精通,这8个入门技巧让你少走弯路,7天速通编程!
-
Python学习就像玩积木,从最基础的块开始,一步步搭建出复杂的作品。我记得刚开始学Python时也是一头雾水,走了不少弯路。现在回头看,其实掌握几个核心概念,就能快速入门这门编程语言。来聊聊怎么用最...
- 神仙级python入门教程(非常详细),从0到精通,从看这篇开始!
-
python入门虽然简单,很多新手依然卡在基础安装阶段,大部分教程对一些基础内容都是一带而过,好多新手朋友,对一些基础知识常常一知半解,需要在网上查询很久。...
- Python类从入门到精通,一篇就够!
-
一、Python类是什么?大家在生活中应该都见过汽车吧,每一辆真实存在、能在路上跑的汽车,都可以看作是一个“对象”。那这些汽车是怎么生产出来的呢?其实,在生产之前,汽车公司都会先设计一个详细的蓝图...
- 学习Python从入门到精通:30天足够了,这才是python基础的天花板
-
当年2w买的全套python教程用不着了,现在送给有缘人,不要钱,一个月教你从入门到精通1、本套视频共487集,本套视频共分4季...
- 30天Python 入门到精通(3天学会python)
-
以下是一个为期30天的Python入门到精通学习课程,专为零基础新手设计。课程从基础语法开始,逐步深入到面向对象编程、数据处理,最后实现运行简单的大语言模型(如基于HuggingFace...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)