zoukankan      html  css  js  c++  java
  • 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);
    		}
    	}
    

      

  • 相关阅读:
    String 总结
    android 调试源码
    Java 随机数总结
    Android中如何控制调节屏幕亮度
    Activity中通过Bundle传递自定义数据类型
    Android AsyncTask简单用法
    WCF 第五章 可信赖会话
    WCF 第五章 会话级别的实例
    WCF 第五章 行为 在WCF一个服务内部的事务操作
    WCF 第五章 导出并发布元数据(服务行为)
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/7844815.html
Copyright © 2011-2022 走看看