ResultSet rs = pstm.executeQuery(sql); 报错 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:

当需要查询的语句带有参数时
执行预编译
**1.原因:**不能在下面这条语句中插入sql值
**2.理由:**因为预编译已经改变了sql语句,向语句中的问号?插入了值,如果在rs语句中插入sql,会导致执行的是原来带问号的sql语句。也就是说预编译的sql语句没有被执行,mysql不能执行带问号的sql语句,所以报错

ResultSet rs = pstm.executeQuery(sql);

DB中的原码(正确)

    //工具方法,sql语句集合,方便调用
    //遍历出数据库中的数据显示在网页
    public static List<Critique> critiqueFind(String sql, Object... objects) throws SQLException {
        //预编译,PreparedStatement:是Statement的子接口,可以传入带占位符的SQL语句,提供了补充占位符变量的方法
        PreparedStatement pstm = connection.prepareStatement(sql);
        //多个?查询

        for (int i = 0;i<objects.length;i++){
            pstm.setObject(i+1,objects[i]);
        }

        ResultSet rs = pstm.executeQuery();
//        System.out.println("$$$$$$$$$$$$$$$$$$$$$"+sql);
        List<Critique> list = new ArrayList<>();
        while (rs.next()) {
            Critique critique = new Critique();
            critique.setId(rs.getInt("id"));
            critique.setArticle_id(rs.getInt("article_id"));
            critique.setContent(rs.getString("content"));
            critique.setName(rs.getString("name"));
            critique.setTime(rs.getString("time"));
            critique.setPhoto(rs.getString("photo"));
            critique.setType(rs.getString("type"));
            critique.setNotice(rs.getString("notice"));
            list.add(critique);
        }
        return list;
    }

版权声明:本文为weixin_44685629原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。