ResultSetMetaData:
1.what:是描述ResultSet 的元数据对象,即从中可以获取到结果集汇中有多少列,列名是什么
2.how:
方法:
public <T> T get (Class<T> clazz , String sql, Object...args){
T entity = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
//try{①}
//②
//③
//④
//⑤
//⑥
}
①得到ResultSetMetaData 对象:
ResultSetMetaData rsmd = resultSet.getMetaData();
调用ResulltSet 的getMeatData() 方法:
②ResultSetMetaData 有哪些好用的方法:
(1)int getColumnCount(): SQL 语句中包含哪些列
(2)String getColumnLabel(int column):获取指定的列的别名,其中索引从1开始.
①:查询(要求列的别名要喝Class对应的类的属性名相同),得到一个ResultSet对象
connection = JDBCTools.getConnection();
preparedStatement = connnection.preparedStatement(sql);
for(int i = 0;i <args.length;i++){
preparedStatement.setObject(i + 1, args[i])
}
resultSet = preparedStatement.executeQuery();
②:得到ResultSetMetaData对象:可以知道SQL语句中查询了哪些列,以及列的别名都是什么
ResultSetMetaData rsmd = resultSet.getMetaData();
③:创建一个Map<String,Object> 对象,键: SQL 查询的列的别名,值:列的值。
Map<String,Object> values = new HashMap<>();
④:处理结果集,利用ResultSetMetaData填充③对应的 Map 对象
if(resultSet.next()){
for(int i = 0 ;i < rsmd.getColumnCount(); i++){
String columnLabel = rsmd.getColumnLabel(i +1);
Object columnValue = resultSet.getObject(i+1);
values.put(columnLabel, columnValue);
}
}
⑤:若 Map 不为空集,利用反射创建 clazz 对应的对象
if(values.size()>0){
entity = clazz.newInstance();
}
⑥:遍历Map对象,利用反射为Class对象的对应的属性复制。
for(Map.Entry<String,Object> entry: values.entrySet()){
String fieldName = entry.getKey();
Object value = entry.getValue();
ReflectionUtils.setFieldValue(entry, fieldName, value);
}