玩转数据库的元信息操作,主要是两个类:
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();
}
}