①getURL():返回一个String类对象,代表数据库的URL。
②getUserName():返回连接当前数据库管理系统的用户名。
③getDatabaseProductName():返回数据库的产品名称。
④getDatabaseProductVersion():返回数据库的版本号。
⑤getDriverName():返回驱动驱动程序的名称。
⑥getDriverVersion():返回驱动程序的版本号。
⑦isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
我们测试一下上面的方法:
package demo; import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class DatabaseMetaDataDemo { /** * @param args */ public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db_test","root","sjjhong"); getBasicInfo(conn); } catch (ClassNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (SQLException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } public static void getBasicInfo(Connection conn) throws SQLException { Properties dbProp = new Properties(); File file = new File("src\\demo\\basicInfo.properties"); DatabaseMetaData dbmd = conn.getMetaData();//获取数据库元数据对象 String url = dbmd.getURL(); String userName = dbmd.getUserName(); String dbName = dbmd.getDatabaseProductName(); String dbVersion = dbmd.getDatabaseProductVersion(); String drName = dbmd.getDriverName(); String drVersion = dbmd.getDriverVersion(); boolean isReadOnly = dbmd.isReadOnly(); String temp = (isReadOnly==true) ? "true" : "false"; // 设置属性 dbProp.setProperty("url",url); dbProp.setProperty("userName",userName); dbProp.setProperty("dbName",dbName); dbProp.setProperty("dbVersion",dbVersion); dbProp.setProperty("drName",drName); dbProp.setProperty("drVersion",drVersion); dbProp.setProperty("isReadOnly",temp); // 把属性全部写入文件 try { PrintWriter pw = new PrintWriter(file);//创建一个新的打印流对象,并使用指定文件作为对象(也可选择控制台) // PrintWriter pw = new PrintWriter(System.out);//选择控制台作为打印对象 // dbProp.list(System.out);//输出到控制台 dbProp.list(pw);//列出所有属性到打印流中 pw.flush();//注意:这里一定要刷新,因为默认是不自动刷新的 System.out.println("write success..."); } catch (FileNotFoundException e) { // TODO 自动生成的 catch 块 System.out.println("can not find the file!"); e.printStackTrace(); } } }
-- listing properties -- url=jdbc:mysql://localhost/db_test dbVersion=5.6.10-log drName=MySQL-AB JDBC Driver dbName=MySQL userName=root@localhost drVersion=mysql-connector-java-5.1.23 ( Revisio... isReadOnly=false
当然,该类方法不仅限于此,比如我们还可以获得数据库中的表,主外键信息等(不一一举例):
public static void showTables(Connection connection) throws SQLException { DatabaseMetaData meta = connection.getMetaData(); //获取数据库连接的元数据 //查询连接的所有Table(如果需要查询视图等,可以在最后的数组中添加VIEW...,依此类推) ResultSet rsTable = meta.getTables(null, null, null, new String[] { "TABLE" }); //获取到的数据是以ResultSet形式返回 while (rsTable.next()) { System.out.println(rsTable.getString(1)); //第一列是Database名称 System.out.println(rsTable.getString(2)); //第二列是用户名称(有的表可能没有对应的用户) System.out.println(rsTable.getString(3)); //第三列就是表名称 } }
使用方式:
1.通过PreparedStatement 类的getParameterMetaData()获取ParameterMetaData对象;2.编写sql语句,调用相应方法。
来看一下ParameterMetaData类的主要方法:
①getParameterCount():获得指定参数的个数
②getParameterType(int param):获得指定参数的sql类型
简单使用下:
public static void basicInfo(Connection conn) throws SQLException { String sql = "select * from tb_9 where id >= ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1,1); ParameterMetaData pmd = ps.getParameterMetaData(); int count = pmd.getParameterCount();//获取参数个数 System.out.println("count = " + count ); ResultSet rs = ps.executeQuery(); while(rs.next()) { System.out.println(rs.getObject("name")); } JDBCUtils.free(rs, ps, conn);//关闭数据库--->不安全,如果上面语句抛出异常则这行读不到 }
①getColumnCount():返回resultset对象的列数
②getColumnName(int column):获得指定列的名称
③getColumnTypeName(int column):获得指定列的类型
public static void basicInfo() { Connection conn = null; ResultSet rs = null; PreparedStatement ps = null; String sql = "select * from tb_9"; try { conn = JDBCUtils.getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); System.out.println("******************************"); int count = rsmd.getColumnCount(); for(int i = 0; i < count; i++) { System.out.println(rsmd.getColumnName(i+1)); } System.out.println("*****************************"); while(rs.next()) { for(int i = 1; i <= count ; i++) { System.out.println(rs.getObject(i)); } } } catch (SQLException e) { // TODO: handle exception e.printStackTrace(); } finally { JDBCUtils.free(rs, ps, conn); } }