13.8 分析数据库信息
大部分时候,只需要对指定数据表进行插入(C)、查询(R)、修改(U)、删除(D)等CRUD
操作;但在某些时候,程序需要动态地获取数据库的相关信息,例如数据库里的数据表信息、列信息。除此之外,如果希望在程序中动态地利用底层数据库所提供的特殊功能,则都需要动态分析数据库相关信息
JDBC
提供了DatabaseMetaData
来封装数据库连接对应数据库的信息,通过Connection
提供的getMetaData()
方法就可以获取数据库对应的DatabaseMetaData
对象。
DatabaseMetaData
接口通常由驱动程序供应商提供实现,其目的是让用户了解底层数据库的相关信息。使用该接口的目的是发现如何处理底层数据库,尤其是对于试图与多个数据库一起使用的应用程序因为应用程序需要在多个数据库之间切换,所以必须利用该接口来找出底层数据库的功能,例如,
- 调用
supportsCorrelatedSubqueries()
方法查看是否可以使用关联子查询,
- 或者调用
supports BatchUpdates()
方法查看是否可以使用批量更新。
许多DatabaseMetaData
方法以ResultSet
对象的形式返回查询信息,然后使用ResultSet
的常规方法(如getString()
和getInt())
即可从这些ResultSet
对象中获取数据。如果查询的信息不可用,则将回一个空ResultSet
对象。
DatabaseMetaData
的很多方法都需要传入一个xxxPattern
模式字符串,这里的xxxPattern
不是正则表达式,而是SQL
里的模式字符串,即:
使用百分号(%
)代表任意多个字符,
使用下画线(_
)代表一个字符。
在通常情况下,如果把该模式字符串的参数值设置为nul
,即表明该参数不作为过滤条件。
实例
下面程序通过DatabaseMetaData
分析了当前Connection
连接对应数据库的一些基本信息,包括当前数据库包含多少数据表,存储过程, student_table
表的数据列、主键、外键等信息.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import java.sql.*; import java.util.*; import java.io.*;
public class DatabaseMetaDataTest { private String driver; private String url; private String user; private String pass; public void initParam(String paramFile)throws Exception { Properties props = new Properties(); props.load(new FileInputStream(paramFile)); driver = props.getProperty("driver"); url = props.getProperty("url"); user = props.getProperty("user"); pass = props.getProperty("pass"); } public void info() throws Exception { Class.forName(driver); try( Connection conn = DriverManager.getConnection(url , user , pass)) { DatabaseMetaData dbmd = conn.getMetaData(); ResultSet rs = dbmd.getTableTypes(); System.out.println("--MySQL支持的表类型信息--"); printResultSet(rs); rs = dbmd.getTables(null,null, "%" , new String[]{"TABLE"}); System.out.println("--当前数据库里的数据表信息--"); printResultSet(rs); rs = dbmd.getPrimaryKeys(null , null, "student_table"); System.out.println("--student_table表的主键信息--"); printResultSet(rs); rs = dbmd.getProcedures(null , null, "%"); System.out.println("--当前数据库里的存储过程信息--"); printResultSet(rs); rs = dbmd.getCrossReference(null,null, "teacher_table" , null, null, "student_table"); System.out.println("--teacher_table表和student_table之间" + "的外键约束--"); printResultSet(rs); rs = dbmd.getColumns(null, null, "student_table", "%"); System.out.println("--student_table表的全部数据列--"); printResultSet(rs); } } public void printResultSet(ResultSet rs)throws SQLException { ResultSetMetaData rsmd = rs.getMetaData(); for (int i = 0 ; i < rsmd.getColumnCount() ; i++ ) { System.out.print(rsmd.getColumnName(i + 1) + "\t"); } System.out.print("\n"); while (rs.next()) { for (int i = 0; i < rsmd.getColumnCount() ; i++ ) { System.out.print(rs.getString(i + 1) + "\t"); } System.out.print("\n"); } rs.close(); } public static void main(String[] args) throws Exception { DatabaseMetaDataTest dt = new DatabaseMetaDataTest(); dt.initParam("mysql.ini"); dt.info(); } }
|
上面程序中的粗体字代码就是使用DatabaseMetaData
分析数据库信息的示例代码。运行上面程序将可以看到通过DatabaseMetaData
分析数据库信息的结果.