6.利用反射及JDBC元数据编写通用的查询方法(尚硅谷笔记)

ResultSetMetaData是描述ResultSet的元数据对象,即从中可以获取到结果集中有多少列,列名是什么。

1.得到ResultSetMetaData对象,调用ResultSet的getMetaData()方法

2.ResultSetMetaData的方法:

int getColumnCount():sql语句中包含哪些列

String getColumnLabel(int column):获取指定的列的别名,其中索引从1开始。

public static <T>T select(Class<T> clazz,String sql,Object...args) {
    Connection connection=null;
    PreparedStatement preparedStatement=null;
    ResultSet resultSet=null;
    T entity=null;
    try {
	connection=getConnection();
	preparedStatement=connection.prepareStatement(sql);
	for(int i=0;i<args.length;i++) {
	    preparedStatement.setObject(i, args[i]);
	}
	//1.得到ResultSet对象
	resultSet=preparedStatement.executeQuery();
	//2.得到ResultSetMetaData对象
	ResultSetMetaData rsmd=resultSet.getMetaData();
	//3.创建一个Map<String,Object>对象
	if(resultSet.next()) {
	    Map<String,Object>map=new HashMap<>();
	    //4.处理结果集,利用ResultSetMetaData填充对应Map对象
	    for(int i=0;i<rsmd.getColumnCount();i++) {
		String columnLabel=rsmd.getColumnLabel(i+1);
		Object columnValue=resultSet.getObject(columnLabel);
		map.put(columnLabel, columnValue);
	    }
	    //5.若Map不为空,利用反射创建clazz对应的对象
	    if(map.size()>0){
		//利用反射创建对象
		entity=clazz.newInstance();
		//6.遍历Map,利用反射为clazz对象的属性赋值
		for(Map.Entry<String, Object> entry:map.entrySet()) {
	    	    String fieldName=entry.getKey();
		    Object value=entry.getValue();
		    ReflectionUtils.setFieldValue(entity,fieldName, value);
		}
	    }
	}
    }catch(Exception e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
    }finally {
	release(resultSet,preparedStatement,connection);
    }
    return entity;
}
发布了90 篇原创文章 · 获赞 48 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Asher_S/article/details/90258741