JDBC利用反射及JDBC元数据编写通用的查询操作

 由Java反射到赋值再到查询的流程图:

 通用获取查询方法:
     * 利用泛型再简化:
     * 1. 利用SQL进行查询,得到结果集
     * 2. 利用发射创建实体类的对象,创建Student对象
     * 3. 获取结果集的列的别名flowId idCard examCard studentName
     * 4. 再获取结果集每一列的值,结合3得到一个Map,Map有一组键值对,
     * 键:列的别名, 值:列的值
     * 5. 利用反射为2对应的属性赋值:属性即为Map的键,值即为Map的值

/**
* @param clazz:描述对象类型
	 * @param sql:SQL语句,可能带占位符
	 * @param args:填充占位符的可变参数
	 * @return
	 */
	public <T> T get( Class<T> clazz, String sql, Object ...args) {
		T entity = null;
		
		Connection connection = null;
		java.sql.Statement statement = null;
		ResultSet resultSet = null;
		
		try {
			//1. 得到ResultSet对象
			connection = JDBCTools.getConnection();
			statement = connection.createStatement();
			resultSet = statement.executeQuery(sql);
			
			//2. 得到ResultSetMetaData对象
			ResultSetMetaData rsmd = (ResultSetMetaData) resultSet.getMetaData();
			
			//3. 创建一个Map<String, Object>对象,键:SQL查询语句列的别名, 值:列的值
			Map<String, Object> values = new HashMap<>();
			
			//4. 处理结果集, 利用ResultSetMetaData填充3对应的Map对象
			if(resultSet.next()) {
				for(int i = 0; i < rsmd.getColumnCount(); i++) {
					String columnLabel = rsmd.getColumnLabel(i + 1);
					Object columnValues = resultSet.getObject(i + 1);
					
					values.put(columnLabel, columnValues);
					
				}
			}
			
			//5. 若Map不为空集, 利用反射创建clazz对应的对象
			if(values.size() > 0) {
				 entity = clazz.newInstance();
				
			}
			
			//6. 遍历Map对象,利用反射为Class对象的对应的属性赋值
			for(Map.Entry<String, Object> entry: values.entrySet()) {
				String fieldName = ((Entry<String, Object>) entity).getKey();
				Object value = entry.getValue();
//				ReflectionUtils.setFieldValues(entity, fieldName, value);//利用反射赋值
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCTools.release(resultSet, statement, connection);
		}
		return entity;
		
	}

调用方法:

@Test
	public void testGet() {
		//flowId idCard examCard studentName为数据表列的别名
		String sql = "SELECT flow_id flowId, type, id_card idCard, exam_card examCard, student_name studentName, "
				+ "location, grade FROM examstudent "
				+ "WHERE flow_id = ?";//?表示占位符
//		System.out.println(sql);
		Student student = get(Student.class, sql, 2);
		System.out.println(student);
	}

其中

ReflectionUtils.setFieldValues(entity, fieldName, value);

此方法代码过长,这里就具体给出,详见Spring ReflectionUtils的方法……

猜你喜欢

转载自blog.csdn.net/wangjian530/article/details/83047518
今日推荐