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日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来