使用封装的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

贴代码

BnakCustomer.money
相关代码怎么写的

参考GPT和自己的思路:

这个错误信息提示你使用封装的JDBC工具类查询数据时出错了。具体错误是无法将null值赋给Java.lang.Integer类型的字段com.glut.api.utils.BnakCustomer.money。你在网上查询到的信息说,你曾尝试将查询到的int类型改为了Integer类型,但是仍然出现了不能为null的错误,这是因为Integer类型的数据也不能为null。

关于为什么Java.lang.Integer类型的数据不能为null,主要是因为Java中的基本数据类型,如int、double等是不支持为null的,但包装类可以,而Integer类型是int类型的包装类。所以,你可以用Integer来包装int类型,但当再次将Integer类型的值赋值给int类型时,需要进行类型转换。另外,建议你检查一下数据库中是否存在为空的数据,如果存在,则需要对查询结果进行空值判断处理,避免出现空指针异常。

img

这个类,成员变量需要加上get/set方法。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^