读书人

JDBC 中 DatabaseMetaData 接口的施用

发布时间: 2012-11-01 11:11:32 作者: rapoo

JDBC 中 DatabaseMetaData 接口的使用
简单介绍一下 java.sql.DatabaseMetaData 接口,关于数据库的整体综合信息。官方 API 文档已经介绍很详细,我这里简单说一下实际的使用。
它还存在一系列的以 supports 开头的接口也比较实用,例如 supportsBatchUpdates() 获取此数据库是否支持批量更新,还有 supportsTransactions() 获取此数据库是否支持事务等等。
实现的功能很简单,就是根据数据库中的表自动生成相对应的 Java Bean 文件。
主要思路是先得到数据库中所有表,再得到每张表的所有字段,如果是主健字段则特殊标记一下。
主要用到几个接口:
ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)
获取可在给定类别中使用的表的描述。
ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
获取可在指定类别中使用的表列的描述。
ResultSet getPrimaryKeys(String catalog, String schema, String table)
获取对给定表的主键列的描述。
ResultSet getExportedKeys(String catalog, String schema, String table)
获取引用给定表的主键列(表导入的外键)的外键列的描述。

               // 取得数据库中所有表名称public List getTables() {List tables = new ArrayList();Connection con = null;ResultSet rs = null;try {con = DbUtils.getConnection("jwdt");rs = con.getMetaData().getTables(null, null, null, new String[] { "TABLE" });while (rs.next()) { // 注意:结果集中存在表的很多信息,表名称在第 3 列tables.add(rs.getString(3));}} catch (Exception e) {e.printStackTrace();} finally {DbUtils.close(con);}return tables;}     // 根据表名称取得表所有字段public List getColumns(String table) {List columns = new ArrayList();Connection con = null;ResultSet rs = null;try {con = DbUtils.getConnection("jwdt");rs = con.getMetaData().getColumns(null, null, table, null);while (rs.next()) { // 注意:结果集中存在表的很多信息,字段名称在第 4 列columns.add(rs.getString(4));}} catch (Exception e) {e.printStackTrace();} finally {DbUtils.close(con);}return columns;}     // 根据表名称取得表主键字段     // 取得表外键字段的操作使用 getExportedKeys(null, null, table) 方法public String getPrimaryKeys(String table) {String keys = "";Connection con = null;ResultSet rs = null;try {con = DbUtils.getConnection("jwdt");rs = con.getMetaData().getPrimaryKeys(null, null, table);while (rs.next()) {// 注意:结果集中存在表的很多信息,字段名称在第 4 列keys += rs.getString(4) + ",";}if (!keys.equals("")) { // 去掉最后面的逗号keys = keys.substring(0, keys.length() - 1);}} catch (Exception e) {e.printStackTrace();} finally {DbUtils.close(con);}return keys;}

生成类属性的时候,还要注意数据库表字段的类型与 Java 类型的对应,最好多加一个方法作类型转换。
生成类文件的方式,建议使用类似 FreeMarker 的模板语言,直接写在 Java 类中代码太难看了。


1 楼 yl419440513 2012-05-04 我也用的是这个,可是却被一个问题难住了,就是getString获取列名称表名称的时候会出现中文名称乱码的情况。我用了new String(rs.getString().getBytes())也是没有效果不知道谁知道呢 2 楼 ezerg 2012-06-04 兄弟,你那样写的效果和没写是一样的,因为你没有转换编码。例如从数据库存储的是ISO-8859-1,而页面显示是GBK,则应该是 new String(rs.getString().getBytes("ISO-8859-1"),"GBK")

读书人网 >其他数据库

热点推荐