数据库元数据MetaData
本篇介绍数据库方面的元数据(MetaData)的有关知识。元数据在建立框架和架构方面是特别重要的知识,再下一篇我们仿造开源数据库工具类DbUtils就要使用数据库的元数据来创建自定义JDBC框架。
在我们前面使用JDBC来处理数据库的接口主要有三个,即Connection,PreparedStatement和ResultSet这三个,而对于这三个接口,还可以获取不同类型的元数据,通过这些元数据类获得一些数据库的信息。
元数据(MetaData),即定义数据的数据。打个比方,就好像我们要想搜索一首歌(歌本身是数据),而我们可以通过歌名,作者,专辑等信息来搜索,那么这些歌名,作者,专辑等等就是这首歌的元数据。因此数据库的元数据就是一些注明数据库信息的数据。
① 由Connection对象的getMetaData()方法获取的是DatabaseMetaData对象。
② 由PreparedStatement对象的getParameterMetaData ()方法获取的是ParameterMetaData对象。
③由ResultSet对象的getMetaData()方法获取的是ResultSetMetaData对象。
下面将对这三种类型的元数据对象进行各自简单地介绍,其中示例中的数据库工具类可以参考《JDBC操作数据库的学习(2)》中定义的JdbcUtils,或者前面几篇关于连接池的如《开源数据库连接池之DBCP》或者《开源数据库连接池之C3P0》等等中定义的JdbcUtils,这里获取连接的方式对本文没有影响,只要我们能获取Connection对象即可。
一、DatabaseMetaData
DatabaseMetaData是由Connection对象通过getMetaData方法获取而来,主要封装了是对数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,数据库的URL,是否支持事务等等,能获取的信息比较多,具体可以参考DatabaseMetaData的API文档。
以下有一些关于DatabaseMetaData的常用方法:
·getDatabaseProductName:获取数据库的产品名称
·getDatabaseProductName:获取数据库的版本号
·getUserName:获取数据库的用户名
·getURL:获取数据库连接的URL
·getDriverName:获取数据库的驱动名称
·driverVersion:获取数据库的驱动版本号
·isReadOnly:查看数据库是否只允许读操作
·supportsTransactions:查看数据库是否支持事务
例1:
简单地获取一些常用的数据库综合信息。
public void testDatabaseMetaData() throws SQLException {
Connection conn = JdbcUtils.getConnection();
DatabaseMetaData dbMetaData = conn.getMetaData();
//获取数据库产品名称
String productName = dbMetaData.getDatabaseProductName();
//获取数据库版本号
String productVersion = dbMetaData.getDatabaseProductVersion();
//获取数据库用户名
String userName = dbMetaData.getUserName();
//获取数据库连接URL
String userUrl = dbMetaData.getURL();
//获取数据库驱动
String driverName = dbMetaData.getDriverName();
//获取数据库驱动版本号
String driverVersion = dbMetaData.getDriverVersion();
//查看数据库是否允许读操作
boolean isReadOnly = dbMetaData.isReadOnly();
//查看数据库是否支持事务操作
boolean supportsTransactions = dbMetaData.supportsTransactions();
}
控制台上结果显示如下:
二、ParameterMetaData
ParameterMetaData是由PreparedStatement对象通过getParameterMetaData方法获取而来,主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,比如像”insert into account(id,name,money) values(?,?,?)”这样的预编译SQL语句,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等等,功能也比较多,这里不列举完,详细请看有关ParameterMetaData的API文档。
以下有一些关于ParameterMetaData的常用方法:
·getParameterCount:获取预编译SQL语句中占位符参数的个数
在我看来,ParameterMetaData对象能用的只有获取参数个数的getParameterCount()方法。
注意:ParameterMetaData许多方法MySQL并不友好支持,比如像获取指定参数的SQL类型的getParameterType方法,如果数据库驱动连接URL只是简单的“jdbc:mysql://localhost:3306/jdbcdemo”那么MyEclipse会抛出SQLException异常,必须要将URL修改为“jdbc:mysql://localhost:3306/jdbcdemo?generateSimpleParameterMetadata=true”才行。但是像getParameterType等等与其他的方法也没多好用,因为如下面的例子,这些方法好像只会将所有的参数认为是字符串(VARCHAR)类型。
例2:
简单地获取预编译SQL中参数的元数据信息,但发现只有获取参数个数好用:
在数据库中创建一个user表,创建的SQL脚本如下:
create table user(
id int primary key,
name varchar(40),
age int
);
接下来对上面这个user表进行ParameterMetaData对象的演示:
public void testParameterMetaData() throws SQLException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
String sql = "insert into user(id,name,age) values(?,?,?)";
st = conn.prepareStatement(sql);
st.setInt(1, 1);
st.setString(2, "Ding");
st.setInt(3, 25); ParameterMetaData paramMetaData = st.getParameterMetaData();
//获取参数个数
int paramCount = paramMetaData.getParameterCount();
//以字符串形式获取指定参数的SQL类型,这里有问题
String paramTypeName = paramMetaData.getParameterTypeName(1);
//返回指定参数的SQL类型,以java.sql.Types类的字段表示,这里有问题
int paramType = paramMetaData.getParameterType(1);
//返回指定参数类型的Java完全限定名称,这里有问题
String paramClassName = paramMetaData.getParameterClassName(1);
//返回指定参数的模,,这里有问题
int paramMode = paramMetaData.getParameterMode(1);
//返回指定参数的列大小,这里有问题
int precision = paramMetaData.getPrecision(1);
//返回指定参数的小数点右边的位数,这里有问题
int scale = paramMetaData.getScale(1);
}
注:完全限定名称,指的是该类型的Java完整名称,包括包名和类型。
在控制台中显示的结果如下:
因为我们的SQL语句为"insert into user(id,name,age) values(?,?,?)",而我们所有利用ParameterMetaData查询的信息除了参数个数以外,都是查询第一个参数的信息,也就是“id”列,而这个“id”列我们创建时是int整型的,但是利用ParameterMetaData的查询结果都是显示为字符串类型,因此我对ParameterMetaData的功能产生了怀疑。
因此在以后使用参数元数据ParameterMetaData尽量只要使用其getParamterCount()方法获取参数个数,对于该对象其他方法请慎用。
三、ResultSetMetaData
ResultSetMetaData是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。关于该结果集元数据对象的其他具体功能和方法请查阅有关ResultSetMetaData的API文档。
以下有一些关于ResultSetMetaData的常用方法:
·getColumnCount:获取结果集中列项目的个数
·getColumnType:获取指定列的SQL类型对应于Java中Types类的字段
·getColumnTypeName:获取指定列的SQL类型
·getClassName:获取指定列SQL类型对应于Java中的类型(包名加类名)
例3:
简单地获取结果集对象中的元数据。
我们创建一个表,这个表和例2相同,同时我们还将在这个表中添加2条数据项:
create table user(
id int primary key,
name varchar(40),
age int
);
insert into user(id,name,age) values(1,'Ding',25);
insert into user(id,name,age) values(2,'LRR',24);
接下来我们要在程序中获取ResultSetMetaData并使用其方法:
public void testResultSetMetaData() throws SQLException {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
String sql = "select * from user";
st = conn.prepareStatement(sql); rs = st.executeQuery();
ResultSetMetaData resultMetaData = rs.getMetaData();
//获取结果集的列数
int columnCount = resultMetaData.getColumnCount();
//获取指定列的名称
String columnName = resultMetaData.getColumnName(1);
//获取指定列的SQL类型对应于java.sql.Types类的字段
int columnType = resultMetaData.getColumnType(1);
//获取指定列的SQL类型
String columnTypeName = resultMetaData.getColumnTypeName(1);
//获取指定列SQL类型对应于Java的类型
String className= resultMetaData.getColumnClassName(1);
//获取指定列所在的表的名称
String tableName = resultMetaData.getTableName(1);
}
在控制台中显示的结果如下:
可以看到通过结果集元数据对象ResultSetMetaData的方法,取得的列数确实是3个(id,name,age),第一列确实是id项,而这个id项确实也是整型。
通过本篇我们学习了在数据库中有关数据库,预编译SQL参数和结果集的三种不同的元数据对象,元数据就是定义数据的数据,通过元数据,我们在下一篇中就可以通过这些定义信息来构建一个自定义的JDBC框架了。
参考博客:
http://luyao123127.iteye.com/blog/678765
http://huweiyi.iteye.com/blog/2123295
http://jiauwu.iteye.com/blog/1307617
http://www.cnblogs.com/xdp-gacl/p/4006830.html
数据库元数据MetaData的更多相关文章
- mysql中,如何查看数据库元数据(metadata)的字符集?
需求描述: mysql中,数据库的元数据也是有字符集的. 操作过程: 1.查看mysql数据库元数据的字符集 mysql> show variables like 'character_set_ ...
- 如何获取SQL Server数据库元数据的方法
发布时间:2007.06.15 05:05 来源:赛迪网 作者:3946469 元数据简介 元数据 (metadata) 最常见的定义为“有关数据的结构数据”,或者再简单一点就是“关于数据 ...
- JDBC(二)之JDBC处理CLOB和BLOB及事务与数据库元数据获取
前面大概介绍了JDBC连接数据库的过程,以及怎么操作数据库,今天给大家分享JDBC怎么处理CLOB和BLOB存储图片的事情,以及JDBC怎么去处理事务.怎么在插入数据的时候生成主键返回值 一.JDBC ...
- 【收藏】关于元数据(Metadata)和元数据管理,这是我的见过最全的解读!
本文主要从元数据的定义.作用.元数据管理现状.管理标准和元数据管理功能等方面讲述了我对元数据(Metadata)和元数据管理的认知及理解. 元数据管理 一.元数据的定义 按照传统的定义,元数据(Met ...
- JDBC中的元数据——1.数据库元数据
package metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import javax.sql.Dat ...
- 浅析ado.net获取数据库元数据信息 DeriveParameters
写这个文章源于早先对ADO.Net获取数据库元数据上的认识,去年我在阅读ADO.Net Core Reference的时候曾经注意过DataSet的FillSchema的这个方法.这方面,在我之前的随 ...
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]
原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇] 通过<实现篇>对WSDL元素和终结点三要素的之间的匹配关系的介绍,我们知道了WSDL的Binding ...
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]
原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇] 元数据的导出就是实现从ServiceEndpoint对象向MetadataSet对象转换的过程,在WCF元数据框 ...
- mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息
1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...
随机推荐
- CMake学习小结
假定有vegagis工程,工程的目录结构如下: #--vegagis# |--src 源文件目录# |--gui 界面工程,输出类型:dll,依赖于QT的QtCore.QtGui.QtXml ...
- Putty远程登录VMware虚拟机Linux(Ubuntu12.04)
为了不至于来回在Win7和Ubuntu12.04之间来回切换,在Win7下使用VMware9.0安装了Ubuntu12.04. 首先下载Vmware9.0虚拟机软件,下载地址为:VMware-work ...
- IOS中使用像素位图(CGImageRef)对图片进行处理
IOS中对图片进行重绘处理的方法总结 一.CGImageRef是什么 CGImageRef是定义在QuartzCore框架中的一个结构体指针,用C语言编写.在CGImage.h文件中,我们可以看到下面 ...
- C++拷贝构造函数详解
转自:http://blog.csdn.net/lwbeyond/article/details/6202256 对于一个空类,编译器默认生成四个成员函数:默认构造函数.析构函数.拷贝构造函数.赋值函 ...
- 【JavaScript】强制缓存刷新
1.在js引用时加入时间戳. <script> document.write('<script src="xxx.js?_dc='+new Date().getTime() ...
- DZNEmptyDataSet框架简介
给大家推荐一个设置页面加载失败时显示加载失败等的框架. 下载地址:DZNEmptyDataSet https://github.com/dzenbot/DZNEmptyDataSet 上效果首先在你的 ...
- 修改字符串 ToCharArray()
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【集训笔记】二分图及其应用【HDOJ1068【HDOJ1150【HDOJ1151
匈牙利算法样例程序 格式说明 输入格式: 第1行3个整数,V1,V2的节点数目n1,n2,G的边数m 第2-m+1行,每行两个整数t1,t2,代表V1中编号为t1的点和V2中编号为t2的点之间有边相连 ...
- Chapter 13 建造者模式
建造者模式又叫生成器模式:将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 代码: package xiao; import java.util. ...
- Altera FPGA中的pin简介
第一步要看的肯定是pin planner ,这个是黑金四代EP4CE15F17C8的视图 先就是发现他们pin有不同的颜色区域,分别对应不同的bank,应该是有的设计里面要求pin在同一个bank吧( ...