JDBC——DatabaseMetaData类、ResultSetMetaData 类 (利用发射及JDBC元数据编写通用的查询方法)

使用 JDBC 驱动程序处理元数据

  Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。根据这些信息,JDBC可以访问一个实现事先并不了解的数据库。

  获取这些信息的方法都是在DatabaseMetaData类的对象上实现的,而DataBaseMetaData对象是在Connection对象上获得的。

DatabaseMetaData类 
DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。
getCatalogs():返回MySQL中有哪些数据库

  ResultSetMetaData是描述ResultSet的元数据对象

  得到:ResultSetMetaData对象:调用ResultSet的getMetaData()方法

      ResultSetMetaData rsmd = resultSet.getMetaData();

  常用的方法:

    String getColumnLabel(int column) 获取指定列的别名,索引从1开始
    getColumnCount():返回当前 ResultSet 对象中的列数。

  获取结果集每一列的别名

 

for(int i = 0; i < rsmd.getColumnCount(); ++i){
  String columnLabel = rsmd.getColumnLabel(i + 1);  
}

  

ResultSetMetaData rsmd = (ResultSetMetaData) res.getMetaData();
while(res.next()) {
	for(int i = 0; i < rsmd.getColumnCount(); ++i) {
		String columnLabel = rsmd.getColumnLabel(i + 1);//获得的是列的别名
		Object columnValue = res.getObject(columnLabel);
	}
}

  

  

ResultSetMetaData 类:可用于获取关于 ResultSet 对象中列的类型和属性信息的对象:
getColumnTypeName(int column):检索指定列的数据库特定的类型名称。 
getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。 
isNullable(int column):指示指定列中的值是否可以为 null
getColumnName(int column):获取指定列的名称,索引从1开始
isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。 

  

通用的查询方法

  public <T> T get(Class<T> clazz, String sql, Object ...args) 

@Test
	public void testResultSetMetaData() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet res = null;
		
		try {
			//1.得到一个ResultSet对象
			String sql = "SELECT flow_id flowId, type, "
					+ "id_card idCard, exam_card examCard, "
					+ "student_name studentName, location, "
					+ "grade FROM examstudent WHERE flow_id = 12";
			conn = (Connection) JDBCTools.getConnection();
			ps = (PreparedStatement) conn.prepareStatement(sql);
			res = ps.executeQuery();
			
			//2.得到ResultSetMetaData对象
			ResultSetMetaData rsmd = (ResultSetMetaData) res.getMetaData();
			
			//3.创建一个Map<String, Object>对象,键:SQL查询的列的别名 值:列的值
			Map<String, Object> values = new HashMap<String, Object>();
			
			//4.处理结果集:利用ResultSetMetaData填充Map对象
			if(res.next()) {
				for(int i = 0; i < rsmd.getColumnCount(); ++i) {
					String columnLabel = rsmd.getColumnLabel(i + 1);//获得的是列的别名
					Object columnValue = res.getObject(columnLabel);
					values.put(columnLabel, columnValue);
				}
			}
			//5.若Map不为空集,利用反射创建clazz对应的对象
			Class<Student> clazz = Student.class;
			Object object = clazz.newInstance();
			
			//6.遍历Map对象,利用反射为Class对象对应的属性赋值
			for(Map.Entry<String, Object> entry: values.entrySet()) {
				String fieldName = entry.getKey();
				Object fieldValue = entry.getValue();
				
				ReflectionTools.setValue(object, fieldName, fieldValue);
			}
			System.out.println(object);
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			JDBCTools.release(res, ps, conn);
		}
	}

  

原文地址:https://www.cnblogs.com/SkyeAngel/p/7844815.html