元數據(MetaData),是指定義數據結構的數據。那么數據庫元數據就是指定義數據庫各類對象結構的數據。 例
如數據庫中的數據庫名,表明, 列名、用戶名、版本名以及從SQL語句得到的結果中的大部分字符串是元數據
使用JDBC來處理數據庫的接口主要有三個,即Connection,PreparedStatement和ResultSet這三個,
而對於這三個接口,還可以獲取不同類型的元數據,通過這些元數據類獲得一些數據庫的信息。
依賴
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency>
獲取數據庫中的元數據信息

package com.zhao.metadata; import org.junit.Before; import org.junit.Test; import java.sql.*; import java.util.Properties; /** * 數據庫 元數據 練習 */ public class metaDataTest { private Connection connection; @Before public void init() throws Exception { String driver ="com.mysql.jdbc.Driver"; String url="jdbc:mysql://127.0.0.1:3306/?useUnicode=true&characterEncoding=utf8"; String username="root"; String password="123456"; Properties props = new Properties(); props.put("remarksReporting","true");//獲取數據庫的備注信息 props.put("user",username); props.put("password",password); //1.獲取連接 Class.forName(driver);//注冊驅動 connection = DriverManager.getConnection(url,props); } //獲取數據庫基本信息 @Test public void test01() throws Exception { //2.獲取元數據 DatabaseMetaData metaData = connection.getMetaData(); //3.獲取數據庫基本信息 System.out.println(metaData.getUserName()); System.out.println(metaData.supportsTransactions());//是否支持事務 System.out.println(metaData.getDatabaseProductName()); } //獲取數據庫列表 @Test public void test02() throws SQLException { //1.獲取元數據 DatabaseMetaData metaData = connection.getMetaData(); //2.獲取所有數據庫列表 ResultSet rs = metaData.getCatalogs(); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); connection.close(); } //獲取指定數據庫中的表信息 @Test public void test03() throws Exception { String driver ="com.mysql.jdbc.Driver"; String url="jdbc:mysql://127.0.0.1:3306/saas?useUnicode=true&characterEncoding=utf8"; String username="root"; String password="123456"; Properties props = new Properties(); props.put("remarksReporting","true");//獲取數據庫的備注信息 props.put("user",username); props.put("password",password); //1.獲取連接 Class.forName(driver);//注冊驅動 connection = DriverManager.getConnection(url,props); //1.獲取元數據 DatabaseMetaData metaData = connection.getMetaData(); //2.獲取數據庫中表信息 /** * String catalog, String schemaPattern,String tableNamePattern, String types[] * * catalog:當前操作的數據庫 * mysql: * :ihrm * catalog * oralce: * xxx:1521:orcl * catalog * schema: * mysql: * :null * oracle: * :用戶名(大寫) * * tableNamePattern: * null:查詢所有表 * 為空:查詢目標表 * * types:類型 * TABLE:表 * VIEW:視圖 * */ ResultSet rs = metaData.getTables(null, null, null, new String[]{"TABLE"}); while (rs.next()) { System.out.println(rs.getString("TABLE_NAME")); } } //獲取指定表中的字段信息 @Test public void test04() throws Exception { String driver ="com.mysql.jdbc.Driver"; String url="jdbc:mysql://127.0.0.1:3306/saas?useUnicode=true&characterEncoding=utf8"; String username="root"; String password="123456"; Properties props = new Properties(); props.put("remarksReporting","true");//獲取數據庫的備注信息 props.put("user",username); props.put("password",password); //1.獲取連接 Class.forName(driver);//注冊驅動 connection = DriverManager.getConnection(url,props); DatabaseMetaData metaData = connection.getMetaData(); //獲取表中的字段信息 /** * catalog * schema * tableName * columnName */ ResultSet rs = metaData.getColumns(null, null, "pe_user", null); while (rs.next()) { System.out.println(rs.getString(4)); //因為他 fields 中第四個的值是 COLUMN_NAME 所以寫COLUMN_NAME 和4 都可以獲取到 //System.out.println(rs.getString("COLUMN_NAME")); } } }
獲取參數元數據

package com.zhao.metadata; import org.junit.Before; import org.junit.Test; import java.sql.*; import java.util.Properties; /** * 測試參數元數據(ParameterMetaData) * 通過PreparedStatement獲取 * 獲取sql參數中的屬性信息 */ public class ParameterMetaDataTest { private Connection connection; @Before public void init() throws Exception { String driver ="com.mysql.jdbc.Driver"; String url="jdbc:mysql://127.0.0.1:3306/saas?useUnicode=true&characterEncoding=utf8"; String username="root"; String password="123456"; Properties props = new Properties(); props.put("remarksReporting","true");//獲取數據庫的備注信息 props.put("user",username); props.put("password",password); //1.獲取連接 Class.forName(driver);//注冊驅動 connection = DriverManager.getConnection(url,props); } //sql = SELECT * FROM `pe_user` WHERE id=1 @Test public void test() throws Exception { // String sql = "select ? from pe_user where id=?"; String sql = "select * from pe_user where id=?"; PreparedStatement pstmt = connection.prepareStatement(sql); /** * parameterIndex 第幾個參數 * x :參數值 */ pstmt.setString(1, "2"); // pstmt.setString(1, "id"); // pstmt.setString(2, "2"); //獲取參數元數據 ParameterMetaData metaData = pstmt.getParameterMetaData(); //一共有幾個參數 int count = metaData.getParameterCount(); System.out.println(count); } }
獲取結果集元數據

package com.zhao.metadata; import org.junit.Before; import org.junit.Test; import java.sql.*; import java.util.Properties; /** * 測試結果集元數據(ResultSetMetaData) * 通過ResultSet獲取 * 獲取查詢結果的信息 */ public class ResultSetMetaDataTest { private Connection connection; @Before public void init() throws Exception { String driver ="com.mysql.jdbc.Driver"; String url="jdbc:mysql://127.0.0.1:3306/saas?useUnicode=true&characterEncoding=utf8"; String username="root"; String password="123456"; Properties props = new Properties(); props.put("remarksReporting","true");//獲取數據庫的備注信息 props.put("user",username); props.put("password",password); //1.獲取連接 Class.forName(driver);//注冊驅動 connection = DriverManager.getConnection(url,props); } @Test public void test() throws Exception { //sql 注:pe_user這個是我的數據庫表名 String sql = "select * from pe_user where id=?"; //PreparedStatement PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, "2"); //查詢 ResultSet rs = pstmt.executeQuery(); //獲取結果集元數據 ResultSetMetaData metaData = rs.getMetaData(); //獲取查詢字段個數 int count = metaData.getColumnCount(); for(int i =1;i<=count ;i++) { //獲取列名 String columnName = metaData.getColumnName(i); //獲取字段類型 sql類型 String columnType = metaData.getColumnTypeName(i); //獲取java類型 String columnClassName = metaData.getColumnClassName(i); System.out.println(columnName+"--"+columnType+"---"+columnClassName); } } }
代碼地址:https://gitee.com/richOne/freemarkerAndMetaData/tree/master