元數(shù)據(jù)
什么是元數(shù)據(jù)
元數(shù)據(jù)就是定義數(shù)據(jù)的數(shù)據(jù),打個(gè)比方,就好像我們要想搜索一首歌(歌本身是數(shù)據(jù)),而我們可以通過歌名,作者,專輯等信息來搜索,那么這些歌名,作者,專輯等等就是這首歌的元數(shù)據(jù)。因此數(shù)據(jù)庫的元數(shù)據(jù)就是一些注明數(shù)據(jù)庫信息的數(shù)據(jù)。
我們一般使用JDBC來處理數(shù)據(jù)庫的接口主要有三個(gè):Connection、PreparedStatement、ResultSet,現(xiàn)在我們可以通過他們的子類實(shí)現(xiàn)對象獲得不同的數(shù)據(jù)庫元數(shù)據(jù)對象
由Connection對象的getMetaData()方法獲取的是DatabaseMetaData對象。
由PreparedStatement對象的getParameterMetaData ()方法獲取的是ParameterMetaData對象。
由ResultSet對象的getMetaData()方法獲取的是ResultSetMetaData對象。結(jié)果集元數(shù)據(jù)
下面分別對這三個(gè)元數(shù)據(jù)進(jìn)行介紹
DatabaseMetaData對象
//獲取Connection元數(shù)據(jù)
Connection.getMetaData()
主要封裝了是對數(shù)據(jù)庫本身的一些整體綜合信息,例如數(shù)據(jù)庫的產(chǎn)品名稱,數(shù)據(jù)庫的版本號,數(shù)據(jù)庫的URL,是否支持事務(wù)等等,能獲取的信息比較多。
以下有一些關(guān)于DatabaseMetaData的常用方法:
getDatabaseProductName:獲取數(shù)據(jù)庫的產(chǎn)品名稱
getDatabaseProductName:獲取數(shù)據(jù)庫的版本號
getUserName:獲取數(shù)據(jù)庫的用戶名
getURL:獲取數(shù)據(jù)庫連接的URL
getDriverName:獲取數(shù)據(jù)庫的驅(qū)動名稱
driverVersion:獲取數(shù)據(jù)庫的驅(qū)動版本號
isReadOnly:查看數(shù)據(jù)庫是否只允許讀操作
supportsTransactions:查看數(shù)據(jù)庫是否支持事務(wù)
@Test
public void test() throws SQLException {
//獲取Connection連接
Connection conn = JDBCUtils.getConnection();
//獲取Connection元數(shù)據(jù)對象
DatabaseMetaData metaData = conn.getMetaData();
String databaseProductName = metaData.getDatabaseProductName();
System.out.println("數(shù)據(jù)庫的產(chǎn)品名稱\t"+databaseProductName);
String databaseProductVersion = metaData.getDatabaseProductVersion();
System.out.println("數(shù)據(jù)庫的版本號\t"+databaseProductVersion);
String userName = metaData.getUserName();
System.out.println("數(shù)據(jù)庫的用戶名\t"+userName);
String url = metaData.getURL();
System.out.println("數(shù)據(jù)庫連接的URL\t"+url);
String driverName = metaData.getDriverName();
System.out.println("數(shù)據(jù)庫的驅(qū)動名稱\t"+driverName);
String driverVersion = metaData.getDriverVersion();
System.out.println("數(shù)據(jù)庫的驅(qū)動版本號\t"+driverVersion);
boolean readOnly = metaData.isReadOnly();
System.out.println("數(shù)據(jù)庫是否只允許讀操作號\t"+readOnly);
boolean supportsTransactions = metaData.supportsTransactions();
System.out.println("數(shù)據(jù)庫是否支持事務(wù)\t"+supportsTransactions);
}
運(yùn)行結(jié)果

ParameterMetaData對象
ParameterMetaData是由PreparedStatement對象通過getParameterMetaData方法獲取而來
要是針對PreparedStatement對象和其預(yù)編譯的SQL命令語句提供一些信息
- getParameterCount:獲取預(yù)編譯SQL語句中占位符參數(shù)的個(gè)數(shù)
ParameterMetaData對象能用的只有獲取參數(shù)個(gè)數(shù)的getParameterCount()方法。
注意:ParameterMetaData許多方法MySQL并不友好支持,比如像獲取指定參數(shù)的SQL類型的getParameterType方法,如果數(shù)據(jù)庫驅(qū)動連接URL只是簡單的“jdbc:mysql://localhost:3306/myDatabase”那么MyEclipse會拋出SQLException異常,必須要將URL修改為“jdbc:mysql://localhost:3306/myDatabase?generateSimpleParameterMetadata=true”才行。但是像getParameterType等等與其他的方法也沒多好用,因?yàn)槿缦旅娴睦?,這些方法好像只會將所有的參數(shù)認(rèn)為是字符串(VARCHAR)類型。

@Test
public void test() throws SQLException {
//獲取Connection連接
Connection conn = JDBCUtils.getConnection();
//準(zhǔn)備sql語句
String sql = "Select * from t_user where name = ? and password = ?";
//獲取PreparedStatement對象
PreparedStatement pstatm = conn.prepareStatement(sql);
//獲取ParameterMetaData對此PreparedStatement元數(shù)據(jù)
ParameterMetaData parMeta = pstatm.getParameterMetaData();
//獲取參數(shù)個(gè)數(shù)
int paramCount = parMeta.getParameterCount();
System.out.println(paramCount);
//以字符串形式獲取指定參數(shù)的SQL類型,這里有問題
String paramTypeName = parMeta.getParameterTypeName(1);
System.out.println(paramTypeName);
//返回指定參數(shù)的SQL類型,以java.sql.Types類的字段表示,這里有問題
int paramType = parMeta.getParameterType(1);
System.out.println(paramType);
//返回指定參數(shù)類型的Java完全限定名稱,這里有問題
String paramClassName = parMeta.getParameterClassName(1);
System.out.println(paramClassName);
//返回指定參數(shù)的模,,這里有問題
int paramMode = parMeta.getParameterMode(1);
System.out.println(paramMode);
//返回指定參數(shù)的列大小,這里有問題
int precision = parMeta.getPrecision(1);
System.out.println(precision);
//返回指定參數(shù)的小數(shù)點(diǎn)右邊的位數(shù),這里有問題
int scale = parMeta.getScale(1);
System.out.println(scale);
}
運(yùn)行結(jié)果

因此在以后使用參數(shù)元數(shù)據(jù)ParameterMetaData盡量只要使用其getParamterCount()方法獲取參數(shù)個(gè)數(shù),對于該對象其他方法請慎用。
ResultSetMetaData對象
ResultSetMetaData是由ResultSet對象通過getMetaData方法獲取而來,主要是針對由數(shù)據(jù)庫執(zhí)行的SQL腳本命令獲取的結(jié)果集對象ResultSet中提供的一些信息,比如結(jié)果集中的列數(shù)、指定列的名稱、指定列的SQL類型等等,可以說這個(gè)是對于框架來說非常重要的一個(gè)對象。
以下有一些關(guān)于ResultSetMetaData的常用方法:
getColumnCount:獲取結(jié)果集中列項(xiàng)目的個(gè)數(shù)
getColumnType:獲取指定列的SQL類型對應(yīng)于Java中Types類的字段
getColumnTypeName:獲取指定列的SQL類型
getClassName:獲取指定列SQL類型對應(yīng)于Java中的類型(包名加類名)
getColumnName:獲取指定列SQL類型對應(yīng)于Java中的類型(包名加類名)
getColumnLable:獲取指定列SQL類型對應(yīng)于Java中的類型(包名加類名)
@Test
public void test() throws SQLException {
//獲取Connection連接
Connection conn = JDBCUtils.getConnection();
//準(zhǔn)備sql語句
String sql = "Select uid as id,uname,password from t_user";
//獲取PreparedStatement對象
PreparedStatement pstatm = conn.prepareStatement(sql);
//獲取結(jié)果集
ResultSet rs = pstatm.executeQuery();
//獲得結(jié)果集元數(shù)據(jù)
ResultSetMetaData resultMetaData = rs.getMetaData();
//獲取結(jié)果集的列數(shù)
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類型對應(yīng)于java.sql.Types類的字段
int columnType = resultMetaData.getColumnType(1);
System.out.println(columnType);
//獲取指定列的SQL類型
String columnTypeName = resultMetaData.getColumnTypeName(1);
System.out.println(columnTypeName);
//獲取指定列SQL類型對應(yīng)于Java的類型
String className= resultMetaData.getColumnClassName(1);
System.out.println(className);
//獲取指定列所在的表的名稱
String tableName = resultMetaData.getTableName(1);
System.out.println(tableName);
}
運(yùn)行結(jié)果
