dhnfjcndi 2023-03-16 19:07 采纳率: 42.9%
浏览 59

使用封装的jdbc工具类查询数据的时候出错

Can not set java.lang.Integer field com.glut.api.utils.BnakCustomer.money to null value
这是错误码,我在网上搜说查询到的int有可能是null,然后我改成了Integer,然后他说Integer也不能为null,为什么啊,而且我的数据库里也没有为null的数据

下面是封装在BaseDao类的一个方法

public <T> List<T> excuteQuery(Class<T> clazz, String sql, Object... params) throws SQLException, InstantiationException, IllegalAccessException, NoSuchFieldException {
            //获取连接
            Connection connection = JdbcUtilsV2.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            
            //?赋值
            if(params!=null&&params.length!=0){
                for (int i = 1; i <= params.length; i++) {
                    preparedStatement.setObject(i,params[i-1]);
                }
            }
            
            //接收结果
            ResultSet resultSet = preparedStatement.executeQuery();
            //解析结果
            List<T> list=new ArrayList<>();
        
            //metaData 装的当前结果集列的信息对象
            ResultSetMetaData metaData = resultSet.getMetaData();
            //可以这样水平遍历列
            int columnCount = metaData.getColumnCount();
            
            while(resultSet.next()){
                //一行数据对应一个T类型对象
                T t =clazz.newInstance();//调用类的无参构造函数实例化对象
                
                //自动遍历列 要从1开始,并且小于等于总列数
                for(int i=1;i<=columnCount;i++){
                    //获取指定对象下角标的值  resultSet
                    Object value = resultSet.getObject(i);
                
                    //获取指定列的下角标的列的名称 ResultSetMetaData
                    //getColumnLabel:会获取别名,没有别名才是列名    getColumnName:只会获取名称
                    String propertyName = metaData.getColumnLabel(i);
                
                    //反射,给对象的属性值赋值
                    Field field = clazz.getDeclaredField(propertyName);
                    field.setAccessible(true);//属性可以设置,打破private的修饰限制
                    /**
                     * 参数1:要赋值的对象  如果属性是静态,第一个参数可以为null
                     * 参数2:具体的属性值
                     */
                    if(value!=null&&t!=null){
                        field.set(t, value);
                    }
                    
                }
                list.add(t);
            }
            //关闭资源
            resultSet.close();
            preparedStatement.close();
            if(connection.getAutoCommit()){
                //没有事务,可以关闭
                JdbcUtilsV2.freeConnection();
            }
            
            return list;
        }

这个是一个测试方法,用来查询

@Test
    public void testSelect() throws Exception {
        
        //3.编写SQL语句
        String sql = "select * from t_bank where id =?";
        //BnakCustomer u =new BnakCustomer();
        List<BnakCustomer> users = excuteQuery(BnakCustomer.class, sql,1);
        System.out.println(users);
    }

用来接收数据的类

public class BnakCustomer {
Integer id;
String account;
Integer money;
}

这是数据库的具体数据

img

img

img

  • 写回答

5条回答 默认 最新

  • pzzhao 2023-03-16 19:20
    关注

    贴代码

    评论

报告相同问题?

问题事件

  • 修改了问题 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 两台交换机分别是trunk接口和access接口为何无法通信,通信过程是如何?
  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画