上一篇(
http://blog.csdn.net/rowandjj/article/details/8967816)我们用jdbc写了一个执行简单CRUD操作的demo,并且学习了几种常见的数据类型(日期、BLOB、CLOB)。那本篇我们主要讲jdbc中的元数据的知识。
jdbc到了版本3以后加入元数据的功能,有了jdbc元数据就可以很方便的获取数据库相关的信息,如果大家了解这项功能,就会发现操作数据库的时候会更得心应手,同时也可以开发出比以前更加自动化的程序.
JDBC中的元数据分为三类,DatabaseMetaData(数据库元数据)、ParameterMetaData(参数元数据),ResultSetMetaData(结果集元数据).他们的作用不同,下面我们逐个研究:
1.DatabaseMetaData(数据库元数据):用来获取数据库的整体综合信息
使用方式:1.通过Connection类的getMetaData方法返回DatabaseMetaData对象;2.操作该元数据对象。
我们主要关注DatabaseMetaData的方法(方法太多,具体不一一列举,读者请自己查看文档,下同):
①getURL():返回一个String类对象,代表数据库的URL。
②getUserName():返回连接当前数据库管理系统的用户名。
③getDatabaseProductName():返回数据库的产品名称。
④getDatabaseProductVersion():返回数据库的版本号。
⑤getDriverName():返回驱动驱动程序的名称。
⑥getDriverVersion():返回驱动程序的版本号。
⑦isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
我们测试一下上面的方法:
package demo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class DatabaseMetaDataDemo
{
/**
* @param args
*/
public static void main(String[] args)
{
try
{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db_test","root","sjjhong");
getBasicInfo(conn);
}
catch (ClassNotFoundException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
catch (SQLException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void getBasicInfo(Connection conn) throws SQLException
{
Properties dbProp = new Properties();
File file = new File("src\\demo\\basicInfo.properties");
DatabaseMetaData dbmd = conn.getMetaData();//获取数据库元数据对象
String url = dbmd.getURL();
String userName = dbmd.getUserName();
String dbName = dbmd.getDatabaseProductName();
String dbVersion = dbmd.getDatabaseProductVersion();
String drName = dbmd.getDriverName();
String drVersion = dbmd.getDriverVersion();
boolean isReadOnly = dbmd.isReadOnly();
String temp = (isReadOnly==true) ? "true" : "false";
// 设置属性
dbProp.setProperty("url",url);
dbProp.setProperty("userName",userName);
dbProp.setProperty("dbName",dbName);
dbProp.setProperty("dbVersion",dbVersion);
dbProp.setProperty("drName",drName);
dbProp.setProperty("drVersion",drVersion);
dbProp.setProperty("isReadOnly",temp);
// 把属性全部写入文件
try
{
PrintWriter pw = new PrintWriter(file);//创建一个新的打印流对象,并使用指定文件作为对象(也可选择控制台)
// PrintWriter pw = new PrintWriter(System.out);//选择控制台作为打印对象
// dbProp.list(System.out);//输出到控制台
dbProp.list(pw);//列出所有属性到打印流中
pw.flush();//注意:这里一定要刷新,因为默认是不自动刷新的
System.out.println("write success...");
}
catch (FileNotFoundException e)
{
// TODO 自动生成的 catch 块
System.out.println("can not find the file!");
e.printStackTrace();
}
}
}
结果:
-- listing properties --
url=jdbc:mysql://localhost/db_test
dbVersion=5.6.10-log
drName=MySQL-AB JDBC Driver
dbName=MySQL
userName=root@localhost
drVersion=mysql-connector-java-5.1.23 ( Revisio...
isReadOnly=false
当然,该类方法不仅限于此,比如我们还可以获得数据库中的表,主外键信息等(不一一举例):
public static void showTables(Connection connection) throws SQLException
{
DatabaseMetaData meta = connection.getMetaData(); //获取数据库连接的元数据
//查询连接的所有Table(如果需要查询视图等,可以在最后的数组中添加VIEW...,依此类推)
ResultSet rsTable = meta.getTables(null, null, null, new String[] { "TABLE" });
//获取到的数据是以ResultSet形式返回
while (rsTable.next())
{
System.out.println(rsTable.getString(1)); //第一列是Database名称
System.out.println(rsTable.getString(2)); //第二列是用户名称(有的表可能没有对应的用户)
System.out.println(rsTable.getString(3)); //第三列就是表名称
}
}
2.ParameterMetaData(参数元数据):
获取关于PreparedStatement对象中每个参数标记的类型和属性信息的对象.
使用方式:
1.通过PreparedStatement 类的getParameterMetaData()获取ParameterMetaData对象;2.编写sql语句,调用相应方法。
来看一下ParameterMetaData类的主要方法:
①getParameterCount():获得指定参数的个数
②getParameterType(int param):获得指定参数的sql类型
简单使用下:
public static void basicInfo(Connection conn) throws SQLException
{
String sql = "select * from tb_9 where id >= ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1);
ParameterMetaData pmd = ps.getParameterMetaData();
int count = pmd.getParameterCount();//获取参数个数
System.out.println("count = " + count );
ResultSet rs = ps.executeQuery();
while(rs.next())
{
System.out.println(rs.getObject("name"));
}
JDBCUtils.free(rs, ps, conn);//关闭数据库--->不安全,如果上面语句抛出异常则这行读不到
}
3.ResultSetMetaData(结果集元数据):可用于获取关于ResultSet对象中列的类型和属性信息的对象
使用方法:
1.通过ResultSet的getMetaData方法,返回ResultSetMetaData对象;2.调用该对象的方法。
该类主要方法:
①getColumnCount():返回resultset对象的列数
②getColumnName(int column):获得指定列的名称
③getColumnTypeName(int column):获得指定列的类型
具体使用:
public static void basicInfo()
{
Connection conn = null;
ResultSet rs = null;
PreparedStatement ps = null;
String sql = "select * from tb_9";
try
{
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
System.out.println("******************************");
int count = rsmd.getColumnCount();
for(int i = 0; i < count; i++)
{
System.out.println(rsmd.getColumnName(i+1));
}
System.out.println("*****************************");
while(rs.next())
{
for(int i = 1; i <= count ; i++)
{
System.out.println(rs.getObject(i));
}
}
}
catch (SQLException e)
{
// TODO: handle exception
e.printStackTrace();
}
finally
{
JDBCUtils.free(rs, ps, conn);
}
}
到这里相信大家对元数据有一定的了解了,希望本文对大家有所帮助。
下一篇我们介绍jdbc事务处理方面的知识,敬请期待!