利用反射写出通用DAO方法

@Test
public void testGet() {
String sql = "select id,name,email,birth from customers where id=?";
int params = 1;
Customer customer = get(Customer.class, sql, params);
System.out.println(customer);
sql = "select flow_id flowId,type,id_card idCard,exam_card examCard,student_name studentName,location,grade from examstudent where flow_id=?";
Student student = get(Student.class, sql, 23);
System.out.println(student);
}

public <T> T get(Class<T> clazz, String sql, Object... params) {
//T entity = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//得到ResultSet对象
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
preparedStatement.setObject(i + 1, params[i]);
}
resultSet = preparedStatement.executeQuery();
//得到ResultSetMetaData对象
ResultSetMetaData resultSetMetaData=resultSet.getMetaData();
int count=resultSetMetaData.getColumnCount();
//处理结果集,利用ResultSetMetaData对象填充对应的Map对象
while (resultSet.next()) {
// 通过解析SQL语句来判断到底选择了哪些列,以及需要为entity对象的哪些属性赋值
//创建一个Map<String,Object>对象,键:SQL查询的列的别名;值:列的值
Map<String,Object> map=new HashMap<String,Object>();
for(int i=0;i<count;i++){
String columnLabel=resultSetMetaData.getColumnLabel(i+1);
Object columnValue=resultSet.getObject(columnLabel);
map.put(columnLabel, columnValue);
}
//若Map不为空集,利用反射创建Clazz对应的对象
if(map.size()>0){
T entity=clazz.newInstance();
for(Map.Entry<String, Object> entry:map.entrySet()){
ReflectionUtils.setFieldValue(entity,entry.getKey(),entry.getValue());
}
return entity;
}
//遍历Map对象,利用反射为Class对象对应的属性赋值。
}
//return entity;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.release(resultSet, preparedStatement, connection);
}
return null;
}

1、利用SQL进行查询,得到结果集
2、利用反射创建实体类的对象:创建Student对象
3、获取结果集的列的别名:如idCard,studentName
4、再获取结果集的每一列的值,结合3得到一个Map,键:列的名,值:列的值
{flowId:5,type:6,idCard:xxxx....}
5、利用反射为2的对应的属性赋值:属性即为Map的键,值即为Map的值


ResultSetMetaData()

1)、是描述ResultSet的元数据对象,即从中可以获取到结果集中有多少列,列名是什么...
2)、如何用?
<1>得到ResultSetMetaData对象:调用 ResultSet的getMetaData()方法
<2>ResultSetMetaData有哪些方法:int getColumnCount() :sql语句中包含 多少列
String getColumnLabel(int column)
获取用于打印输出和显示的指定列的建议标题。 即指定列的别名,其中索引从1开始

原文地址:https://www.cnblogs.com/xiaona19841010/p/5198595.html