元数据
什么是元数据
元数据就是定义数据的数据,打个比方,就好像我们要想搜索一首歌(歌本身是数据),而我们可以通过歌名,作者,专辑等信息来搜索,那么这些歌名,作者,专辑等等就是这首歌的元数据。因此数据库的元数据就是一些注明数据库信息的数据。
我们一般使用JDBC来处理数据库的接口主要有三个:Connection、PreparedStatement、ResultSet,现在我们可以通过他们的子类实现对象获得不同的数据库元数据对象
由Connection对象的getMetaData()方法获取的是DatabaseMetaData对象。
由PreparedStatement对象的getParameterMetaData ()方法获取的是ParameterMetaData对象。
由ResultSet对象的getMetaData()方法获取的是ResultSetMetaData对象。结果集元数据
下面分别对这三个元数据进行介绍
DatabaseMetaData对象
//获取Connection元数据
Connection.getMetaData()
主要封装了是对数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,数据库的URL,是否支持事务等等,能获取的信息比较多。
以下有一些关于DatabaseMetaData的常用方法:
getDatabaseProductName:获取数据库的产品名称
getDatabaseProductName:获取数据库的版本号
getUserName:获取数据库的用户名
getURL:获取数据库连接的URL
getDriverName:获取数据库的驱动名称
driverVersion:获取数据库的驱动版本号
isReadOnly:查看数据库是否只允许读操作
supportsTransactions:查看数据库是否支持事务
@Test
public void test() throws SQLException {
//获取Connection连接
Connection conn = JDBCUtils.getConnection();
//获取Connection元数据对象
DatabaseMetaData metaData = conn.getMetaData();
String databaseProductName = metaData.getDatabaseProductName();
System.out.println("数据库的产品名称\t"+databaseProductName);
String databaseProductVersion = metaData.getDatabaseProductVersion();
System.out.println("数据库的版本号\t"+databaseProductVersion);
String userName = metaData.getUserName();
System.out.println("数据库的用户名\t"+userName);
String url = metaData.getURL();
System.out.println("数据库连接的URL\t"+url);
String driverName = metaData.getDriverName();
System.out.println("数据库的驱动名称\t"+driverName);
String driverVersion = metaData.getDriverVersion();
System.out.println("数据库的驱动版本号\t"+driverVersion);
boolean readOnly = metaData.isReadOnly();
System.out.println("数据库是否只允许读操作号\t"+readOnly);
boolean supportsTransactions = metaData.supportsTransactions();
System.out.println("数据库是否支持事务\t"+supportsTransactions);
}
运行结果
ParameterMetaData对象
ParameterMetaData是由PreparedStatement对象通过getParameterMetaData方法获取而来
要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息
- getParameterCount:获取预编译SQL语句中占位符参数的个数
ParameterMetaData对象能用的只有获取参数个数的getParameterCount()方法。
注意:ParameterMetaData许多方法MySQL并不友好支持,比如像获取指定参数的SQL类型的getParameterType方法,如果数据库驱动连接URL只是简单的“jdbc:mysql://localhost:3306/myDatabase”
那么MyEclipse会抛出SQLException异常,必须要将URL修改为“jdbc:mysql://localhost:3306/myDatabase?generateSimpleParameterMetadata=true”
才行。但是像getParameterType等等与其他的方法也没多好用,因为如下面的例子,这些方法好像只会将所有的参数认为是字符串(VARCHAR)类型。
@Test
public void test() throws SQLException {
//获取Connection连接
Connection conn = JDBCUtils.getConnection();
//准备sql语句
String sql = "Select * from t_user where name = ? and password = ?";
//获取PreparedStatement对象
PreparedStatement pstatm = conn.prepareStatement(sql);
//获取ParameterMetaData对此PreparedStatement元数据
ParameterMetaData parMeta = pstatm.getParameterMetaData();
//获取参数个数
int paramCount = parMeta.getParameterCount();
System.out.println(paramCount);
//以字符串形式获取指定参数的SQL类型,这里有问题
String paramTypeName = parMeta.getParameterTypeName(1);
System.out.println(paramTypeName);
//返回指定参数的SQL类型,以java.sql.Types类的字段表示,这里有问题
int paramType = parMeta.getParameterType(1);
System.out.println(paramType);
//返回指定参数类型的Java完全限定名称,这里有问题
String paramClassName = parMeta.getParameterClassName(1);
System.out.println(paramClassName);
//返回指定参数的模,,这里有问题
int paramMode = parMeta.getParameterMode(1);
System.out.println(paramMode);
//返回指定参数的列大小,这里有问题
int precision = parMeta.getPrecision(1);
System.out.println(precision);
//返回指定参数的小数点右边的位数,这里有问题
int scale = parMeta.getScale(1);
System.out.println(scale);
}
运行结果
因此在以后使用参数元数据ParameterMetaData尽量只要使用其getParamterCount()方法获取参数个数,对于该对象其他方法请慎用。
ResultSetMetaData对象
ResultSetMetaData是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定列的SQL类型等等,可以说这个是对于框架来说非常重要的一个对象。
以下有一些关于ResultSetMetaData的常用方法:
getColumnCount:获取结果集中列项目的个数
getColumnType:获取指定列的SQL类型对应于Java中Types类的字段
getColumnTypeName:获取指定列的SQL类型
getClassName:获取指定列SQL类型对应于Java中的类型(包名加类名)
getColumnName:获取指定列SQL类型对应于Java中的类型(包名加类名)
getColumnLable:获取指定列SQL类型对应于Java中的类型(包名加类名)
@Test
public void test() throws SQLException {
//获取Connection连接
Connection conn = JDBCUtils.getConnection();
//准备sql语句
String sql = "Select uid as id,uname,password from t_user";
//获取PreparedStatement对象
PreparedStatement pstatm = conn.prepareStatement(sql);
//获取结果集
ResultSet rs = pstatm.executeQuery();
//获得结果集元数据
ResultSetMetaData resultMetaData = rs.getMetaData();
//获取结果集的列数
int columnCount = resultMetaData.getColumnCount();
System.out.println(columnCount);
//获取指定列的名称
String columnName = resultMetaData.getColumnName(1);
System.out.println(columnName);
//获取指定列的名称(有别名则为别名)
String columnLable = resultMetaData.getColumnLabel(1);
System.out.println(columnLable);
//获取指定列的SQL类型对应于java.sql.Types类的字段
int columnType = resultMetaData.getColumnType(1);
System.out.println(columnType);
//获取指定列的SQL类型
String columnTypeName = resultMetaData.getColumnTypeName(1);
System.out.println(columnTypeName);
//获取指定列SQL类型对应于Java的类型
String className= resultMetaData.getColumnClassName(1);
System.out.println(className);
//获取指定列所在的表的名称
String tableName = resultMetaData.getTableName(1);
System.out.println(tableName);
}
运行结果