本篇介紹數據庫方面的元數據(MetaData)的有關知識。元數據在創建框架和架構方面是特別重要的知識,再下一篇咱們仿造開源數據庫工具類DbUtils就要使用數據庫的元數據來建立自定義JDBC框架。html
在咱們前面使用JDBC來處理數據庫的接口主要有三個,即Connection,PreparedStatement和ResultSet這三個,而對於這三個接口,還能夠獲取不一樣類型的元數據,經過這些元數據類得到一些數據庫的信息。java
元數據(MetaData),即定義數據的數據。打個比方,就好像咱們要想搜索一首歌(歌自己是數據),而咱們能夠經過歌名,做者,專輯等信息來搜索,那麼這些歌名,做者,專輯等等就是這首歌的元數據。所以數據庫的元數據就是一些註明數據庫信息的數據。mysql
① 由Connection對象的getMetaData()方法獲取的是DatabaseMetaData對象。sql
② 由PreparedStatement對象的getParameterMetaData ()方法獲取的是ParameterMetaData對象。數據庫
③由ResultSet對象的getMetaData()方法獲取的是ResultSetMetaData對象。架構
下面將對這三種類型的元數據對象進行各自簡單地介紹,其中示例中的數據庫工具類能夠參考《JDBC操做數據庫的學習(2)》中定義的JdbcUtils,或者前面幾篇關於鏈接池的如《開源數據庫鏈接池之DBCP》或者《開源數據庫鏈接池之C3P0》等等中定義的JdbcUtils,這裏獲取鏈接的方式對本文沒有影響,只要咱們能獲取Connection對象便可。框架
DatabaseMetaData是由Connection對象經過getMetaData方法獲取而來,主要封裝了是對數據庫自己的一些總體綜合信息,例如數據庫的產品名稱,數據庫的版本號,數據庫的URL,是否支持事務等等,能獲取的信息比較多,具體能夠參考DatabaseMetaData的API文檔。ide
如下有一些關於DatabaseMetaData的經常使用方法:工具
·getDatabaseProductName:獲取數據庫的產品名稱學習
·getDatabaseProductName:獲取數據庫的版本號
·getUserName:獲取數據庫的用戶名
·getURL:獲取數據庫鏈接的URL
·getDriverName:獲取數據庫的驅動名稱
·driverVersion:獲取數據庫的驅動版本號
·isReadOnly:查看數據庫是否只容許讀操做
·supportsTransactions:查看數據庫是否支持事務
例1:
簡單地獲取一些經常使用的數據庫綜合信息。
1 public void testDatabaseMetaData() throws SQLException { 2 Connection conn = JdbcUtils.getConnection(); 3 DatabaseMetaData dbMetaData = conn.getMetaData(); 4 //獲取數據庫產品名稱
5 String productName = dbMetaData.getDatabaseProductName(); 6 //獲取數據庫版本號
7 String productVersion = dbMetaData.getDatabaseProductVersion(); 8 //獲取數據庫用戶名
9 String userName = dbMetaData.getUserName(); 10 //獲取數據庫鏈接URL
11 String userUrl = dbMetaData.getURL(); 12 //獲取數據庫驅動
13 String driverName = dbMetaData.getDriverName(); 14 //獲取數據庫驅動版本號
15 String driverVersion = dbMetaData.getDriverVersion(); 16 //查看數據庫是否容許讀操做
17 boolean isReadOnly = dbMetaData.isReadOnly(); 18 //查看數據庫是否支持事務操做
19 boolean supportsTransactions = dbMetaData.supportsTransactions(); 20 }
控制檯上結果顯示以下:
ParameterMetaData是由PreparedStatement對象經過getParameterMetaData方法獲取而來,主要是針對PreparedStatement對象和其預編譯的SQL命令語句提供一些信息,好比像」insert into account(id,name,money) values(?,?,?)」這樣的預編譯SQL語句,ParameterMetaData能提供佔位符參數的個數,獲取指定位置佔位符的SQL類型等等,功能也比較多,這裏不列舉完,詳細請看有關ParameterMetaData的API文檔。
如下有一些關於ParameterMetaData的經常使用方法:
·getParameterCount:獲取預編譯SQL語句中佔位符參數的個數
在我看來,ParameterMetaData對象能用的只有獲取參數個數的getParameterCount()方法。
注意:ParameterMetaData許多方法MySQL並不友好支持,好比像獲取指定參數的SQL類型的getParameterType方法,若是數據庫驅動鏈接URL只是簡單的「jdbc:mysql://localhost:3306/jdbcdemo」那麼MyEclipse會拋出SQLException異常,必需要將URL修改成「jdbc:mysql://localhost:3306/jdbcdemo?generateSimpleParameterMetadata=true」才行。可是像getParameterType等等與其餘的方法也沒多好用,由於以下面的例子,這些方法好像只會將全部的參數認爲是字符串(VARCHAR)類型。
例2:
簡單地獲取預編譯SQL中參數的元數據信息,但發現只有獲取參數個數好用:
在數據庫中建立一個user表,建立的SQL腳本以下:
create table user( id int primary key, name varchar(40), age int );
接下來對上面這個user表進行ParameterMetaData對象的演示:
1 public void testParameterMetaData() throws SQLException { 2 Connection conn = null; 3 PreparedStatement st = null; 4 ResultSet rs = null; 5 try{ 6 conn = JdbcUtils.getConnection(); 7 String sql = "insert into user(id,name,age) values(?,?,?)"; 8 st = conn.prepareStatement(sql); 9 st.setInt(1, 1); 10 st.setString(2, "Ding"); 11 st.setInt(3, 25); 12
13 ParameterMetaData paramMetaData = st.getParameterMetaData(); 14 //獲取參數個數
15 int paramCount = paramMetaData.getParameterCount(); 16 //以字符串形式獲取指定參數的SQL類型,這裏有問題
17 String paramTypeName = paramMetaData.getParameterTypeName(1); 18 //返回指定參數的SQL類型,以java.sql.Types類的字段表示,這裏有問題
19 int paramType = paramMetaData.getParameterType(1); 20 //返回指定參數類型的Java徹底限定名稱,這裏有問題
21 String paramClassName = paramMetaData.getParameterClassName(1); 22 //返回指定參數的模,,這裏有問題
23 int paramMode = paramMetaData.getParameterMode(1); 24 //返回指定參數的列大小,這裏有問題
25 int precision = paramMetaData.getPrecision(1); 26 //返回指定參數的小數點右邊的位數,這裏有問題
27 int scale = paramMetaData.getScale(1); 28 }
注:徹底限定名稱,指的是該類型的Java完整名稱,包括包名和類型。
在控制檯中顯示的結果以下:
由於咱們的SQL語句爲"insert into user(id,name,age) values(?,?,?)",而咱們全部利用ParameterMetaData查詢的信息除了參數個數之外,都是查詢第一個參數的信息,也就是「id」列,而這個「id」列咱們建立時是int整型的,可是利用ParameterMetaData的查詢結果都是顯示爲字符串類型,所以我對ParameterMetaData的功能產生了懷疑。
所以在之後使用參數元數據ParameterMetaData儘可能只要使用其getParamterCount()方法獲取參數個數,對於該對象其餘方法請慎用。
ResultSetMetaData是由ResultSet對象經過getMetaData方法獲取而來,主要是針對由數據庫執行的SQL腳本命令獲取的結果集對象ResultSet中提供的一些信息,好比結果集中的列數、指定列的名稱、指定列的SQL類型等等,能夠說這個是對於框架來講很是重要的一個對象。關於該結果集元數據對象的其餘具體功能和方法請查閱有關ResultSetMetaData的API文檔。
如下有一些關於ResultSetMetaData的經常使用方法:
·getColumnCount:獲取結果集中列項目的個數
·getColumnType:獲取指定列的SQL類型對應於Java中Types類的字段
·getColumnTypeName:獲取指定列的SQL類型
·getClassName:獲取指定列SQL類型對應於Java中的類型(包名加類名)
例3:
簡單地獲取結果集對象中的元數據。
咱們建立一個表,這個表和例2相同,同時咱們還將在這個表中添加2條數據項:
create table user( id int primary key, name varchar(40), age int ); insert into user(id,name,age) values(1,'Ding',25); insert into user(id,name,age) values(2,'LRR',24);
接下來咱們要在程序中獲取ResultSetMetaData並使用其方法:
1 public void testResultSetMetaData() throws SQLException { 2 Connection conn = null; 3 PreparedStatement st = null; 4 ResultSet rs = null; 5 try{ 6 conn = JdbcUtils.getConnection(); 7 String sql = "select * from user"; 8 st = conn.prepareStatement(sql); 9 10 rs = st.executeQuery(); 11 ResultSetMetaData resultMetaData = rs.getMetaData(); 12 //獲取結果集的列數 13 int columnCount = resultMetaData.getColumnCount(); 14 //獲取指定列的名稱 15 String columnName = resultMetaData.getColumnName(1); 16 //獲取指定列的SQL類型對應於java.sql.Types類的字段 17 int columnType = resultMetaData.getColumnType(1); 18 //獲取指定列的SQL類型 19 String columnTypeName = resultMetaData.getColumnTypeName(1); 20 //獲取指定列SQL類型對應於Java的類型 21 String className= resultMetaData.getColumnClassName(1); 22 //獲取指定列所在的表的名稱 23 String tableName = resultMetaData.getTableName(1); 24 }
在控制檯中顯示的結果以下:
能夠看到經過結果集元數據對象ResultSetMetaData的方法,取得的列數確實是3個(id,name,age),第一列確實是id項,而這個id項確實也是整型。
經過本篇咱們學習了在數據庫中有關數據庫,預編譯SQL參數和結果集的三種不一樣的元數據對象,元數據就是定義數據的數據,經過元數據,咱們在下一篇中就能夠經過這些定義信息來構建一個自定義的JDBC框架了。
參考博客:
http://luyao123127.iteye.com/blog/678765
http://huweiyi.iteye.com/blog/2123295