【JAVA基础】 反射实现JDBC工具类映射结果到实体类

/**
 * 数据库查询方法
 * @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);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值