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