OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
JDBC中的元数据,有数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaData)
分别封装了数据库产品名字等数据库信息、查询参数的个数等参数信息、结果集的列数等结果集信息。
数据库元数据
/**
*数据库的整体综合信息。 */ public interface DatabaseMetaData extends Wrapper { /**
* 查询数据库产品的名字
*/
String getDatabaseProductName() throws SQLException; /**
* 查询数据库产品的版本号。
*/
String getDatabaseProductVersion() throws SQLException; } /**
* 一个被用来获得每一个参数的类型和属性的对象 */ public interface ParameterMetaData extends Wrapper { /**
* 查询参数的个数。
*/
int getParameterCount() throws SQLException; } /**
* 一个被用来获得ResultSet中的列的类型和属性的对象。 */ public interface ResultSetMetaData extends Wrapper { /**
* 返回结果集中的列数。
*/
int getColumnCount() throws SQLException; }
上述不完整源码,摘自OpenJDK源码java.sql包,完整源码请参考OpenJDK源码,完整用法请参考JDK API文档。
小试牛刀
package cn.fansunion.project; import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException; /**
*
* OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData)
* ,结果集元数据(ResultSetMetaData)
*
* @author LeiWen@FansUnion.cn 2013年11月2日
*
*/
public class JDBCMetadataExample { public static void main(String[] args) throws ClassNotFoundException,
SQLException {
Connection con = getOneConnection();
// 数据库元数据
DatabaseMetaData dbmd = con.getMetaData();
displayDatabaseMetaData(dbmd); println("\n"); // Password是密文,Windows数据库表名不区分大小写
String sql = "select User,Password,Host from mysql.user where User=? and Host = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "root");
ps.setString(2, "localhost");
ResultSet userResultSet = ps.executeQuery();
// 参数元数据
ParameterMetaData pmd = ps.getParameterMetaData();
displayParameterMedata(pmd);
println(); // 结果集元数据
ResultSetMetaData rsmd = userResultSet.getMetaData();
displayResultSetMetaData(rsmd); println("查询的用户列表:");
while (userResultSet.next()) {
print(userResultSet.getString("User") + "\t");
print(userResultSet.getString("Password") + "\t");
println(userResultSet.getString("Host"));
}
} // 获得一个数据库连接
private static Connection getOneConnection() throws ClassNotFoundException,
SQLException {
// 加载MySQL数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 根据3个参数构造数据库连接
String url = "jdbc:mysql://localhost:3306";
String name = "root";
String password = "123456";
Connection con = DriverManager.getConnection(url, name, password);
return con;
} // 工具方法:打印数据库的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要修改代码结构。
private static void displayDatabaseMetaData(DatabaseMetaData dbmd)
throws SQLException {
// 元数据信息
println("驱动的名字:" + dbmd.getDriverName());
println("驱动的版本号:" + dbmd.getDriverVersion());
println("数据库产品名字:" + dbmd.getDatabaseProductName());
println("数据库产品版本号:" + dbmd.getDatabaseProductVersion());
println("数据库主版本号:" + dbmd.getDatabaseMajorVersion());
println("数据库次版本号:" + dbmd.getDatabaseMinorVersion()); println("JDBC主版本号:" + dbmd.getJDBCMajorVersion());
println("JDBC次版本号:" + dbmd.getJDBCMinorVersion());
// 元数据获得的数据库名字结果集
ResultSet dbResultSet = dbmd.getCatalogs();
// 打印所有数据库的名字
while (dbResultSet.next()) {
print(dbResultSet.getString(1) + "\t");
}
} // 工具方法:打印结果集的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要代码结构。
private static void displayResultSetMetaData(ResultSetMetaData rsmd)
throws SQLException {
int columnCount = rsmd.getColumnCount();
println("查询的列数:" + columnCount);
} // 工具方法:打印参数的元数据。如果想打印更多信息,只要扩展这个方法即可,不需要修改代码结构。
private static void displayParameterMedata(ParameterMetaData pmd)
throws SQLException {
int parameterCount = pmd.getParameterCount();
println("参数的个数:" + parameterCount);
} // 工具方法:简化打印输出
private static void println() {
System.out.println();
} private static void println(Object o) {
System.out.println(o);
} private static void print(Object o) {
System.out.print(o);
} }
有模有样
驱动的名字:MySQL-AB JDBC Driver
驱动的版本号:mysql-connector-java-5.1.22 ( Revision: ${bzr.revision-id} )
数据库产品名字:MySQL
数据库产品版本号:5.5.17
数据库主版本号:5
数据库次版本号:5
JDBC主版本号:4
JDBC次版本号:0
information_schema mysql
参数的个数:2
查询的列数:3
查询的用户列表:
root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 localhost
元数据的一种典型应用-数据库管理系统
有兴趣的朋友,可以读下
一个HelloWorld版的MySQL数据库管理器的设计与实现(源码)
相关阅读
OpenJDK源码研究过程中整理的学习笔记。 OpenJDK是GPL许可(GPL-licensed)的Java平台的开源实现。
原文参见:http://FansUnion.cn/articles/3066(小雷网-FansUnion.cn)
OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa的更多相关文章
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...
- OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计
前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
在研究OpenJDK源码过程中,我发现常用的设计方法就是2种:接口,接口-抽象类-具体实现类 . 在一些其它开源框架和业务开发中,经常存在着第3种设计,接口-具体实现类. 1.只有接口,没有实现类. ...
- OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言
友情提示 本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合. 本文中的代码注释比较多,不再过多解释. 更多用法,还是得看JDK的API或者看原文http://developer ...
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...
- OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...
- OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法
本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法. 这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...
- OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)
在上一篇OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构中,我们大致了解了Java字节码文件的结构. 本篇详细地介绍了如何读取.class文件的大部分细节. 1.构造文件 ...
随机推荐
- 走进 CPU 的 Cache
看了上一篇文章.你可能非常想知道,为什么程序的执行结果会是这样.如今,就让我们来走进 CPU 的世界. 在 SMP(对称多处理器)时代,多个 CPU 一起工作.使运算能力进一步提升,那么CPU 是怎样 ...
- HNU13377:Book Club(DFS)
Problem description Porto's book club is buzzing with excitement for the annual book exchange event! ...
- android取高度
Rect rect = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int top = r ...
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- PostgreSQL Replication之第四章 设置异步复制(1)
执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...
- php基础:define()定义常数函数
define(); 常量类似变量,不同之处在于: 在设定以后,常量的值无法更改 常量名不需要开头的美元符号 ($) 作用域不影响对常量的访问 常量值只能是字符串或数字 <?php define( ...
- 一个icon的选中与不选中
页面的样式展示 1.页面中选中的状态 2.页面中未选中的状态 3.俩个icon代表的状态 页面的布局展示 <label> <i class="iconfont icon-d ...
- lsof---查看你进程开打的文件
lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户 ...
- 紫书 例题 10-24 UVa 1641(面积计算)
遍历一遍,遇到边界为奇数次时,格子在多边形内 偶数次时,在多边形外 #include<cstdio> #define REP(i, a, b) for(int i = (a); i < ...
- [JLOI2015]装备购买(线性基)
[JLOI2015]装备购买 题目描述 脸哥最近在玩一款神奇的游戏,这个游戏里有 nn 件装备,每件装备有 \(m\) 个属性,用向量 \(\mathbf{z_i}\)=\((a_1, \ldots ...