/**
* 数据库查询方法
* @param sql
* @param <T> 存储数据的实体类
* @param values 需要填充的数据
* @return ArrayList<T>
*/
public synchronized <T> ArrayList<T> executeQuery(String sql,Class<T> clazz,Object... values) {
ArrayList<T> stuList = new ArrayList<>();
try {
dbconn();
preStmt = conn.prepareStatement(sql);
getValues(preStmt,values);//sqlstatement填充数据 此处封装了个方法
ResultSet rs = preStmt.executeQuery();
ResultSetMetaData metaData = rs.getMetaData(); //获取结果季中的信息结构
int metaDataColumnCount = metaData.getColumnCount();//获取列数
//如果有下一行,则
while (rs.next()){
T stu = clazz.newInstance(); //通过反射机制创建对象
Field[] declaredFields = clazz.getDeclaredFields(); //获取类里面的属性
//通过列数循环,获取对应的列名称和列属性
for (int i = 1; i <= metaDataColumnCount; i++) {
String columnName = metaData.getColumnName(i); //获取第i列的字段名称
//循环获取通过反射机制获取的类的属性
for (Field f: declaredFields) {
f.setAccessible(true); //取消访问权限
//若列名称和对应的属性名相同,则赋值
if(f.getName().equals(columnName)){
Object objectVal = rs.getObject(i);//获取第i列的 某行值
//判断数据库类型和实体类属性里的类型是否一致
typeChange(objectVal,f,stu);//类型转换
break;
}
}
}
stuList.add(stu);
}
} catch (SQLException e) {
logger.error(null,e);
} catch (InstantiationException e) {
logger.error(null,e);
} catch (IllegalAccessException e) {
logger.error(null,e);
} finally {
closeMethod();
}
return stuList;
}
/**
* 数据库类型转java实体类型
* @param objectVal 数据库的值
* @param f Java 实体字段
* @param stu Java实体对象
* @throws IllegalAccessException
*/
private void typeChange(Object objectVal,Field f,Object stu) throws IllegalAccessException {
if(objectVal!=null && objectVal.getClass().equals(Date.class)){//数据库属性值的类型为Date.class
if(f.getType().equals(String.class)){//java实体属性类型是String 和 即数据库类型不匹配
//将数据库的值取出,转换成Java 实体属性类型所对应的值
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String format = sdf.format(objectVal);
f.set(stu,format);
}else{
f.set(stu,objectVal);
}
}else if(objectVal!=null && objectVal.getClass().equals(BigDecimal.class)){//数据库属性值的类型为BigDecimal.class
if(f.getType().equals(Double.class)){//java实体属性类型是Double 和 即数据库类型不匹配
//将数据库的值取出,转换成Java 实体属性类型所对应的值
BigDecimal db = (BigDecimal) objectVal;
double v = db.doubleValue();
f.set(stu,v);
}else{
f.set(stu,objectVal);
}
}else {
f.set(stu,objectVal);
}
}
【JAVA基础】 反射实现JDBC工具类映射结果到实体类
于 2022-11-06 14:04:06 首次发布