我是靠谱客的博主 紧张发卡,最近开发中收集的这篇文章主要介绍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的方法……

最后

以上就是紧张发卡为你收集整理的JDBC利用反射及JDBC元数据编写通用的查询操作的全部内容,希望文章能够帮你解决JDBC利用反射及JDBC元数据编写通用的查询操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部