BUZHIDAO52 2022-12-16 09:29 采纳率: 40%
浏览 30
已结题

JDBC预编译SQL语句正常,但是结果集为空的问题

问题遇到的现象和发生背景
遇到的现象和发生背景,请写出第一个错误信息
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
运行结果及详细报错内容
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

学习JavaWeb遇到了一些问题,怀疑是和JDBC相关的
问题描述:我根据BaseDAO写了两个实现类的代码,通过BaseDAO传入的可变参数填充占位符,但是有一个可以实现查询,有一个只能查询到空值,通过调试,我发现两段代码都能正确的预编译SQL语句,但是其中一个查询的结果集总是为空的

希望各位好兄弟能指点一二
这边是我BaseDAO的代码

//有事务版本的通用的返回多个对象查询方法
    public List<T> getForList(Connection connection, String sql, Object ...args){
        //Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            //connection = JDBCutil.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            //填充占位符
            for (int i = 0;i < args.length;i++){
                preparedStatement.setObject(i+1,args[i]);
            }
            //返回结果集
            resultSet = preparedStatement.executeQuery();
            //获取结果集元数据
            ResultSetMetaData metaData = resultSet.getMetaData();
            //获取结果集当前里面的列数
            int columnCount = metaData.getColumnCount();
            ArrayList<T> list = new ArrayList<>();
            while (resultSet.next()){
                T t = (T) clazz.newInstance();
                //处理这一行数据的每一列
                for(int i = 0;i < columnCount;i++){
                    //获取这列的数值
                    Object object = resultSet.getObject(i + 1);
                    //获取这列的名字(数据库表中)
                    //String columnName = metaData.getColumnName(i + 1);
                    String columnLabel = metaData.getColumnLabel(i + 1);
                    //调用方法,通过列名查询到该字段,并且返回一个filed对象
                    Field declaredField = t.getClass().getDeclaredField(columnLabel);
                    //提高反射权限
                    declaredField.setAccessible(true);
                    //给当前根据列名字查询到的filed对象赋值
                    declaredField.set(t,object);
                }
                list.add(t);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            //JDBCutil.closeResource(connection,preparedStatement,resultSet);
            JDBCutil.closeResource(null,preparedStatement,resultSet);
        }
        return null;
    }

这边是我实现类查询为空的代码

@Override
    public List<Fruit> getByNewPage(Connection connection, String keyword, int pageNo) {
        String sql = "select id,name,price,count,remark from fruit where name = ? or remark = ? limit ?, 5";
        List<Fruit> forList = getForList(connection,  sql, keyword,keyword,(pageNo-1)*5);
        return forList;
    }

这边是我实现类可以查询到数据的代码

@Override
    public List<Fruit> getByPage(Connection connection, int pageNo) {
        String sql = "select id,name,price,count,remark from fruit limit ?, 5";
        List<Fruit> forList = getForList(connection,  sql, (pageNo-1)*5);
        return forList;
    }
  • 写回答

3条回答 默认 最新

  • BCS-点心 2022-12-16 09:33
    关注

    1.直接在数据库执行没数据的sql,看是否有数据
    2.如果数据库查询有数据,说明数据查到后,在代码里进行赋值时有问题
    3.大概率是传参导致的sql查不到数据

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月24日
  • 已采纳回答 12月16日
  • 创建了问题 12月16日

悬赏问题

  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测