一、Java获取数据库表的各个字段的相关信息

在某些开发情景中,需要获取数据库中表的各个字段的相关信息,如字段名,字段类型,字段大小等信息。

DatabaseMetaData 是有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作。 

ResultSet 是关于某个表的信息或一个查询的结果。您必须逐行访问数据行,但是您可以任何顺序访问列。 

ResultSetMetaData 存储的是有关 ResultSet 中列的名称和类型的信息。 

ResultSet 对象是 JDBC 中最重要的单个对象。从本质上讲,它是对一个一般宽度和未知长度的表的一种抽象。几乎所有的方法和查询都将数据作为 ResultSet 返回。ResultSet 包含任意数量的命名列,您可以按名称访问这些列。它还包含一个或多个行,您可以按顺序自上而下逐一访问。

使用 getMetaData() 方法从 ResultSet 中获取 ResultSetMetaData 对象。可以使用此对象获得列的各个相关信息。

使用ResultSetMetaData获取各列相关信息的代码示例如下: 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class TestDemo {
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://数据库IP地址:3306/数据库名称";
String user = "数据库用户名";
String pass = "数据库用户密码";
conn = DriverManager.getConnection(url, user, pass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) {
	Connection conn = getConnection();
	String sql = "select * from AccessType";
	PreparedStatement stmt;
	try {
		stmt = conn.prepareStatement(sql);
		ResultSet rSet = stmt.executeQuery(sql);
		ResultSetMetaData data = rSet.getMetaData();
		for (int i = 1; i <= data.getColumnCount(); i++) {
			// 获得所有列的数目及实际列数
			int columnCount = data.getColumnCount();
			// 获得指定列的列名
			String columnName = data.getColumnName(i);
            //String columnName = data.getColumnLabel(i);该函数也能获取列名
			// 获得指定列的列值
			int columnType = data.getColumnType(i);
			// 获得指定列的数据类型名
			String columnTypeName = data.getColumnTypeName(i);
			// 所在的Catalog名字
			String catalogName = data.getCatalogName(i);
			// 对应数据类型的类
			String columnClassName = data.getColumnClassName(i);
			// 在数据库中类型的最大字符个数
			int columnDisplaySize = data.getColumnDisplaySize(i);
			// 默认的列的标题
			String columnLabel = data.getColumnLabel(i);
			// 获得列的模式
			String schemaName = data.getSchemaName(i);
			// 某列类型的精确度(类型的长度)
			int precision = data.getPrecision(i);
			// 小数点后的位数
			int scale = data.getScale(i);
			// 获取某列对应的表名
			String tableName = data.getTableName(i);
			// 是否自动递增
			boolean isAutoInctement = data.isAutoIncrement(i);
			// 在数据库中是否为货币型
			boolean isCurrency = data.isCurrency(i);
			// 是否为空
			int isNullable = data.isNullable(i);
			// 是否为只读
			boolean isReadOnly = data.isReadOnly(i);
			// 能否出现在where中
			boolean isSearchable = data.isSearchable(i);
			System.out.println(columnCount);
			System.out.println("获得列" + i + "的字段名称:" + columnName);
			System.out.println("获得列" + i + "的类型,返回SqlType中的编号:"+ columnType);
			System.out.println("获得列" + i + "的数据类型名:" + columnTypeName);
			System.out.println("获得列" + i + "所在的Catalog名字:"+ catalogName);
			System.out.println("获得列" + i + "对应数据类型的类:"+ columnClassName);
			System.out.println("获得列" + i + "在数据库中类型的最大字符个数:"+ columnDisplaySize);
			System.out.println("获得列" + i + "的默认的列的标题:" + columnLabel);
			System.out.println("获得列" + i + "的模式:" + schemaName);
			System.out.println("获得列" + i + "类型的精确度(类型的长度):" + precision);
			System.out.println("获得列" + i + "小数点后的位数:" + scale);
			System.out.println("获得列" + i + "对应的表名:" + tableName);
			System.out.println("获得列" + i + "是否自动递增:" + isAutoInctement);
			System.out.println("获得列" + i + "在数据库中是否为货币型:" + isCurrency);
			System.out.println("获得列" + i + "是否为空:" + isNullable);
			System.out.println("获得列" + i + "是否为只读:" + isReadOnly);
			System.out.println("获得列" + i + "能否出现在where中:"+ isSearchable);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
	}
}

二、如何直接通过ResultSet将数据转为Json对象?

根据以上所述,可以使用ResultMetaData,遍历每一条获取到的数据的列信息,以列名为key,值为value,存入Json对象中即可。

以下代码为简化版,没有考虑列数据的类型,都以String类型统一处理,其实还应该使用getColumnTypeName()函数判断该列的类型,并使用ResultSet对应的getXXX函数获取列的值。

public JSONObject mapper(ResultSet rSet) throws SQLException {
	JSONObject jsonObject = new JSONObject();
	//获取列数
	ResultSetMetaData metaData = rSet.getMetaData();
	int columnCount = metaData.getColumnCount();
	//遍历每一列
	for (int i = 1; i <= columnCount; i++) {
		//获取列名
		String columnName = metaData.getColumnName(i);
		String value = rSet.getString(columnName);
		jsonObject.put(columnName, value);					
	}
	return jsonObject;
}