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)流程图

 

posted @ 2019-10-22 21:38  ifreewolf  阅读(596)  评论(0编辑  收藏  举报