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); } }