工作中有时候不得不使用JDBC进行查询,此时最麻烦的就是手工从结果集中获取数据的过程,这里博主写了一个简单的工具类去做JDBC结果集和对应实体之间的转换,代码如下:
/**
* 转换数据 JDBC结果集转实体
*
* @param resultSet 结果集
* @param clazz 实体字节码文件对象
* @param <T> 实体类型
* @throws Exception sql异常 NoClass异常等等
*/
public static <T> List<T> exchangeData(ResultSet resultSet, Class<T> clazz) throws Exception {
//获取全部类方法 包括父类的
Method[] declaredMethods = clazz.getMethods();
List<T> list = new ArrayList<>();
ResultSetMetaData metaData = resultSet.getMetaData();
while (resultSet.next()) {
//反射实例化对象
T obj = clazz.newInstance();
//遍历类调用方法
for (Method method : declaredMethods) {
//获取方法名
String name = method.getName();
if (!name.startsWith("set")){
//只要setter
continue;
}
//获取数据库名 驼峰命名法转数据库字段命名法
String dbName = getDbName(name);
//遍历数据库所有列
for (int i = 1; i <= metaData.getColumnCount(); i++) {
//抓取指定列赋值
if (metaData.getColumnName(i).equals(dbName)) {
if (resultSet.getObject(i) != null) {
//赋值
setValue(obj,method,resultSet,i);
}
break;
}
}
}
list.add(obj);
}
return list;
}
/**
* 赋值操作,
* 主要是处理数据类型
* 此处只简单处理下基本数据类型和Date类型
* @param obj 泛型对象
* @param method 方法
* @param resultSet 结果集
* @param i 脚标
* @param <T> 泛型
*/
private static <T> void setValue(T obj, Method method, ResultSet resultSet, int i) throws SQLException, InvocationTargetException, IllegalAccessException {
//Setter方法只有一个参数,获取参数类型名称
String name = method