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

要怎么使用这个工具类进行查询呢

跟着尚硅谷的jdbc视频写了一个查询的工具类,但是具体使用的时候出了点问题。

具体代码

package com.glut.api.utils;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class 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&¶ms.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:具体的属性值
                     */
                    field.set(t, value);
                }
                list.add(t);
            }
            //关闭资源
            resultSet.close();
            preparedStatement.close();
            if(connection.getAutoCommit()){
                //没有事务,可以关闭
                JdbcUtilsV2.freeConnection();
            }
            return list;
        }
}

这是创建数据库的sql语句,一共有两条数据。

CREATE TABLE t_bank (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'账号主键',
account VARCHAR(20)NOT NULL UNIQUE COMMENT'账号',
money INT UNSIGNED COMMENT'金额,不能为负值');
INSERT INTO t_bank (account , money) VALUES
( 'ergouzi',1000), ( 'lvdandan',1000) ;

接下来写了一个类,

package com.glut.api.utils;
public class BnakCustomer {
Integer id;
String account;
Integer money;
}

就是我用下面这个方法运行,会出错,错误码是Can not set java.lang.Integer field com.glut.api.utils.BnakCustomer.money to null value,可能是我自己写的代码的问题,最上面的那个查询的工具类应该是没有问题,因为是跟着敲的,我想问一下,如果我想使用上面那个工具类查询,我应该怎么写?

    @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);
    }
  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-03-16 21:00
    关注

    参考GPT和自己的思路:

    根据您提供的代码和错误信息分析,问题出在了 BnakCustomer 类的 money 属性上,这个属性的类型是 Integer,但是查询结果中出现了 NULL 值,导致 NullPointerException。解决方法是将 money 属性改成 int 类型即可,或者在查询时对这个字段进行判空处理。

    至于您想要使用工具类进行查询的问题,您可以在测试类中调用 BaseDao 类的 excuteQuery 方法,并传入对应的参数,即可使用这个工具类进行查询。具体示例代码如下:

    @Test
    public void testSelect() throws Exception {
        // 编写 SQL 语句
        String sql = "SELECT * FROM t_bank WHERE account=?";
        // 调用工具类查询数据
        List<BnakCustomer> customers = new BaseDao().excuteQuery(BnakCustomer.class, sql, "ergouzi");
        // 打印查询结果
        System.out.println(customers);
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 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项目写一个抽奖动画