java.sql.SQLException: Wrong number of parameters: expected 0, was given 3 Query dbutil的模糊查询插入问题

这篇博客讨论了在Java中使用QueryRunner进行SQL查询时,如何通过预编译占位符提高效率,避免了字符串拼接导致的问题。文章通过示例展示了错误的使用方式,即直接在SQL语句中包含百分号,以及正确的解决方案,即使用问号占位符并手动添加百分号。作者还展示了如何进行参数绑定和执行查询,确保了SQL注入的安全性。
  public List<Book> findBook(String search) throws SQLException {

        Connection conn = DbUtil.getDataSource().getConnection();

        //创建SQL执行工具
        QueryRunner queryRunner = new QueryRunner();
/*
        String sql = "SELECT\n" +
                "    book.*\n" +
                "FROM\n" +
                "    book\n" +
                "WHERE\n" +
                "        book.book_name LIKE \'%?%\' OR\n" +
                "        book.book_author LIKE \'%?%\'  OR\n" +
                "        book.book_commit LIKE \'%?%\' \n" +
                "LIMIT 0, 100\n";
                //把\'%?%\' 识别成了一个字符串而不是占位符
*/
//-------------------------------解决 -------------------------------
        String sql = "SELECT\n" +
                "    book.*\n" +
                "FROM\n" +
                "    book\n" +
                "WHERE\n" +
                "        book.book_name LIKE ? OR\n" +
                "        book.book_author LIKE  ? OR\n" +
                "        book.book_commit LIKE ? \n" +
                "LIMIT 0, 100\n";
       
        search='%'+search+'%';//把要插入的变量进行修改
//--------------------------------------------------------------
         LOGGER.debug("    search:"+search);
        List<Book> query = queryRunner.query(conn, sql, new BeanListHandler<>(Book.class),search,search,search);

        conn.close();
        return query;
    }
在使用 JDBC 进行数据库操作时,`java.sql.SQLException: Wrong number of parameters: expected 0, was given 1` 异常通常表明 SQL 语句中定义的参数占位符数量与实际提供的参数数量不一致。具体而言,该错误表示 SQL 语句中没有定义任何参数占位符(即没有 `?`),但执行时却传入了一个参数[^2]。 ### 常见原因及解决方法 1. **SQL 语句中未使用参数占位符** 如果 SQL 语句中未包含 `?` 作为参数占位符,但执行语句时却传入了参数,就会导致此异常。例如: ```java String sql = "SELECT * FROM users WHERE id = 1"; QueryRunner qr = new QueryRunner(); qr.query(sql, new BeanHandler<>(User.class), 1); // 错误:提供了参数但 SQL 中没有占位符 ``` **解决方法**:确保 SQL 语句中包含与参数数量一致的 `?` 占位符: ```java String sql = "SELECT * FROM users WHERE id = ?"; qr.query(sql, new BeanHandler<>(User.class), 1); // 正确 ``` 2. **参数数量与占位符数量不一致** 如果 SQL 语句中有多个 `?`,但传入的参数数量不匹配,也会导致此类错误。例如: ```java String sql = "INSERT INTO users (name, age) VALUES (?, ?)"; qr.update(sql, "Alice"); // 错误:两个占位符但只传入一个参数 ``` **解决方法**:确保传入的参数数量与 `?` 的数量一致: ```java qr.update(sql, "Alice", 30); // 正确 ``` 3. **使用集合类型传参时未正确转换为数组** 当使用 `List` 或其他集合类型存储参数时,未将其转换为数组直接传入也可能导致错误: ```java List<Object> params = new ArrayList<>(); params.add("Alice"); params.add(30); qr.update(sql, params); // 错误:未使用 toArray() ``` **解决方法**:使用 `toArray()` 方法将集合转换为数组: ```java qr.update(sql, params.toArray()); // 正确 ``` 4. **拼接 SQL 语句时逻辑错误** 在动态拼接 SQL 语句时,可能由于逻辑错误导致最终语句中缺少 `?` 或者多出 `?`。 **解决方法**:仔细检查 SQL 拼接逻辑,必要时打印完整 SQL 语句进行调试。 --- ### 示例代码:正确使用参数绑定 ```java String sql = "INSERT INTO users (name, age) VALUES (?, ?)"; QueryRunner qr = new QueryRunner(dataSource); List<Object> params = new ArrayList<>(); params.add("Bob"); params.add(25); qr.update(sql, params.toArray()); ``` --- ### 总结 - 确保 SQL 语句中使用的 `?` 占位符数量与实际传入的参数数量一致。 - 使用集合传参时,务必调用 `toArray()` 方法进行转换。 - 在动态 SQL 构建过程中,建议加入日志输出或断言检查,以避免参数不匹配问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值