JDBC学习笔记--通用的查询方法
1.why:查询时方法的逻辑类似,很多代码雷同.
2.what:
1).方法的签名
/**
* 通用的查询方法,可以根据传入的SQL、Class对象返回SQL对应的记录的对象
* @param clazz :描述对象的类型
* @param sql :SQL语句。可能带占位符
* @param args : 填充占位符的可变参数
* @param <T>
* @return
*/
public <T> T get(Class<T> clazz, String sql, Object ... args){
//...
}
2).使用该方法
String sql = "SELECT id, name, email, birth FROM customers WHERE id = ?";
Customer customer = get(Customer.class, sql, 1001);
System.out.println(sql);
System.out.println(customer);
sql = "SELECT flow_id flowId, type type, id_card idCard, exam_card examCard, " + //第二个是别名,别名指的是指定的属性名,数据表与类的属性名对应
"student_name studentName, location location, grade grade FROM examstudent WHERE flow_id = ?";
Student student = get(Student.class, sql, 5);
System.out.println(sql);
System.out.println(student);
3.how
1).实现该方法需要综合使用反射,JDBC,JDBC元数据的知识
2).具体步骤
//1.得到ResultSet对象
//2.得到ResultSetMetaData对象
//3.创建一个Map<String, Object>对象,键:SQL查询的列的别名,值:列的值
//4.处理结果集,利用ResultSetMetaData填充3对应的Map对象
for(int i = 0; i < rsmd.getColumnCount(); i++){
String columnLabel = rsmd.getColumnLabel(i + 1);
Object columnValue = resultSet.getObject(i + 1);
values.put(columnLabel, columnValue);
}
//5.若Map不为空,利用反射创建clazz对应的对象
//5.遍历Map对象,利用反射为Class对象的对应的属性赋值.
if(values.size() > 0){
entity = clazz.newInstance();
for(Map.Entry<String, Object> entry: values.entrySet()){
String fieldName = entry.getKey();
Object value = entry.getValue();
ReflectionUtils.setFieldValue(entity, fieldName, value);
}
}
3)流程图