元數(shù)據(jù)

元數(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ù)對象

  1. 由Connection對象的getMetaData()方法獲取的是DatabaseMetaData對象。

  2. 由PreparedStatement對象的getParameterMetaData ()方法獲取的是ParameterMetaData對象。

  3. 由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é)果

image

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)類型。

image

@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é)果


image

因此在以后使用參數(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é)果


image

參考博客
https://www.cnblogs.com/fjdingsd/p/5273277.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容