日期:2014-05-16  浏览次数:20472 次

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")