1. 程式人生 > >玩轉MySQL ------使用java獲取資料庫的原資訊

玩轉MySQL ------使用java獲取資料庫的原資訊

玩轉資料庫的元資訊操作,主要是兩個類:

1) DatabaseMetaData類: 包含驅動資訊、資料庫名、表名(檢視、儲存過程等)

通過con.getMetaData()可獲得一個DatabaseMetaData類物件

2) ResultSetMetaData類: 包含表結構相關的資訊,如:列(欄位)的個數、名字、型別

和屬性等資訊

  通過rs.getMetaData()可獲得一個ResultSetMetaData類物件

一、接下來進行DatabaseMetaData的操作演示:

1.獲取MySQL等版本資訊:

	@Test
	// DatabaseMetaData類的操作演示
	public void DBMetaDemo() throws Exception {
                Connection conn = Conn4Utils.getConn();//獲取conn的工具類
		DatabaseMetaData dm = conn.getMetaData();

		System.out.println(dm.getDriverName());
		System.out.println(dm.getDriverVersion());
		System.out.println(dm.getDriverMajorVersion());
		System.out.println(dm.getDriverMinorVersion());
		System.out.println(dm.getMaxStatements());
		System.out.println(dm.getJDBCMajorVersion());
		System.out.println("---------1--------");
    }

結果:

2.獲取資料庫名:

// /////如何獲取資料庫名////////
		ResultSet rs = dm.getCatalogs();
		while (rs.next()) {
			String name = rs.getString("TABLE_CAT");
			System.out.println(name);
		}

結果:

PS: 型別"TABLE"可從API文件中的getTableTypes()方法中查到,開啟API,找到DatabaseMetaDate類:

找到方法getTables:

點開:

3.如何在已知資料庫名的情況下,獲取它當中的表名

使用getTables方法:

引數1和引數2都是資料庫名,之所以要兩個引數,是因為該函式要相容不同的資料庫,引數2可給正則的形式。引數3是表格

名,null為不用正則匹配,若取"%a%"代表只獲取名字中包含"a"的表格(檢視等),引數4是表格的型別如Table、View等

ResultSet rs3 = dm.getTables("abc", "abc", null,
				new String[] { "TABLE" });// 型別"TABLE"可從API文件中的getTableTypes()方法中查到
		while (rs3.next()) {
			String str = rs3.getString("TABLE_NAME"); // 欄位名"TABLE_NAME"可從API文件中的getTables()方法中查到
			System.out.println(str);
		}

結果:

4.獲取一個數據庫中表資訊

// 獲取一個數據庫中表資訊---寫死的---如果把資料庫名和表名寫成活的就可獲取任意資料庫與資料表
		Statement st = conn.createStatement();
		st.execute("use abc"); // execute()方法可以執行任意sql,包含: use aa, create
								// database, create table, alter...
		ResultSet rs2 = st.executeQuery(" select * from stud3");
		while (rs2.next()) {
			String str = rs2.getString(2);
			System.out.println(str);
		}

結果:

二、 ResultSetMetaData類的操作演示

1.跨庫查詢用"資料庫名.表名",這部分可用DBMetadata把它做活

同樣也是用ResultSet 的 rs.getMetaData()獲取元資料,然後獲取列,獲取表的資料。

@Test
	// ResultSetMetaData類的操作演示
	public void RSMetaDemo() throws Exception {
		Connection conn = Conn4Utils.getConn();
		Statement st = conn.createStatement();
		String sql = "select * from abc.stud3"; // 跨庫查詢用"資料庫名.表名",這部分可用DBMetadata把它做活
		ResultSet rs = st.executeQuery(sql);

		// ※※※
		ResultSetMetaData rsmd = rs.getMetaData();// 結果集元資料
		int columns = rsmd.getColumnCount(); // 欄位數量/列數

		// ///輸出表頭////
		for (int i = 1; i <=columns; i++) {
             String fieldName=rsmd.getColumnName(i);//jdbc中的列序號都是從1開始
 			System.out.print(fieldName+"\t");      
		}
    
		System.out.println();
		System.out.println("--------------------------");
		
		while(rs.next()){
			//輸出一行資料
			for(int i=0;i<columns;i++){
				String str = rs.getString(i+1);
				System.out.print(str+"\t");
			}
			System.out.println();
		}
	}

結果: