package cn.hncu.meta;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import org.junit.Test;
import cn.hncu.pool.ConnUtils3;
import cn.hncu.pool.ConnUtils4;
/*
* 要點:
操縱: 數據庫驅動的信息、數據庫名、數據表信息(名字、個數) ---java.sql.DatabaseMetaData <---通過con.getMetaData()獲得
操縱: 表結構信息,如字段名、列數 ---java.sql.ResultSetMetaData <--- 通過rs.getMetaData()獲得
*數據庫的其它稱呼: Catlog,Schema , Database
*/
public class MetaDataDemo {
Connection con = ConnUtils3.getConn();
@Test
public void DatabaseMetaDataDemo() throws Exception{
DatabaseMetaData dm = con.getMetaData();
System.out.println(dm.getDriverName());
System.out.println(dm.getDatabaseMajorVersion()+"."+dm.getDatabaseMinorVersion());
System.out.println(dm.getMaxStatements());
System.out.println(dm.getJDBCMajorVersion());//jdbc4.0
System.out.println("--------------------------");
//返回所有數據庫的名字
ResultSet rs = dm.getCatalogs();
while(rs.next()){
String name = rs.getString("TABLE_CAT");
String name2 = rs.getString(1);
System.out.println(name+","+name2);
}
System.out.println("--------------------------");
//返回某個數據庫的表名
//參數解析: 第1和第2個都是數據庫的名字(2個,是為兼容不同數據庫), 第3個參數是查詢表名的過濾模式(null為不過濾即查所有,"%a%"為表名中包含字母'a'),最后一個參數是表類型如"TABLE"、"VIEW"等(這些值可查看API中getTableTypes()方法)
rs = dm.getTables("hncu", "hncu", null, new String[]{"TABLE","VIEW"} );
while(rs.next()){
String name = rs.getString("TABLE_NAME"); //字符串參數的具體取值參看API中getTables()
String name2 = rs.getString("TABLE_TYPE");
System.out.println(name+","+name2);
}
System.out.println("--------------------------");
//如果已知數據庫的名字,打開該數據庫。如果還知道某個表的名字,那么可以操縱這個表
String s1 = "hncu";
con.createStatement().execute("use "+s1);//該方法能夠執行所有SQL語句,包括: use hncu; drop database hncu
String s2 = "stud";
ResultSet rs2 = con.createStatement().executeQuery("select * from "+ s2);
while(rs2.next()){
//如果已經列數n,就可輸出表格的所有數據
int n = 2;
for(int i=1;i<=n;i++){
Object obj = rs2.getObject(i);
System.out.print(obj+" ");
}
System.out.println();
}
}
@Test //表結構信息
public void ResultSetMetaDataDemo() throws Exception{
//跨庫查詢
Connection con = ConnUtils4.getConn(); //該版本的配置文件的url中是沒有數據庫名字的
String dbName = "abc"; //數據庫名
String tableName = "stud"; //表名
String sql = "select * from " + dbName+"."+tableName;
ResultSet rs = con.createStatement().executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
//獲取當前表格的列數
int columns = rsmd.getColumnCount();
System.out.println("列數:"+columns);
//輸出當前表格的表頭
System.out.println("------------------");
for(int i=0; i<columns;i++){
System.out.print(rsmd.getColumnName(i+1)+"\t");
}
System.out.println();
System.out.println("------------------");
//輸出表數據
while (rs.next()) {
//輸出一行
for (int i = 0; i < columns; i++) {
System.out.print(rs.getObject(i + 1) + "\t");
}
System.out.println();
}
}
}
