MySQL 資料庫 like 語句萬用字元模糊查詢小結

2020-10-14 19:00:34

MySQL 報錯:Parameter index out of range (1 > number of parameters, which is 0)——MySQL 資料庫 like 語句萬用字元模糊查詢小結


前言

今天在使用MySQL語句執行增刪改查操作時,控制檯報出了以下錯誤:Parameter index out of range (1 > number of parameters, which is 0)。翻譯過來意思就是:查到結果資料為1,真實值應為0,引數越界,產生錯誤。如此也就明確了我們具體出錯的地方——引數,即對於萬用字元"?"的處理。本文分別對執行普通 SQL 語句以及使用 like 語句進行萬用字元模糊查詢遇到本錯誤進行了剖析,並給出解決方案。

在這裡插入圖片描述


一、分析 SQL 語句

1、普通 SQL 語句的查詢分析

首先,我們來分析一下我之前使用的 SQL 語句:

String sql = "select count(*) from tab_route where cid = ?";

說明:我們直接使用萬用字元"?"來代替引數,使用 Spring 框架的 JdbcTemplate 執行增刪改查操作。在這裡是沒有任何問題的。

2、普通 SQL 查詢語句如何處理

如果在這裡出錯,請按照如下方式進行解決:

  1. 檢查萬用字元"?"的格式,注意是在英文輸入法下輸入,非中文問號;
  2. 檢查 SQL 語句,使用萬用字元傳遞的引數是不加引號的,比如下面的就是錯誤的:
String sql = "select count(*) from tab_route where cid = '?'";

3、使用 like 萬用字元模糊查詢語句分析

同理,我們依舊採用上面的方式進行模糊查詢操作,來看一下出錯的 SQL 語句:

String sql = "select count(*) from tab_route where rname like '%?%';

執行結果報錯Parameter index out of range (1 > number of parameters, which is 0)

結果分析:查到結果資料為1,真實值應為0,引數越界,產生錯誤。

我們明確如下語句是沒有任何問題的:

String sql = select * from tab_route where rname like '%張%';

如此也就明確了我們具體出錯的地方——引數,即對於 like 語句中萬用字元"?"的處理。

二、like 語句使用萬用字元模糊查詢剖析

1、like 語句的應用場景

使用 like 萬用字元進行模糊查詢是我們在專案中常遇到的,比如在搜尋方塊中對於資料的模糊查詢。

2、模糊查詢剖析

在 SQL 語句中無法直接對'%?%'進行解析,所以我們需要對連線的字串進行處理,使用動態拼接concat()方法將'%?%'中的內容進行連線,然後再執行增刪改查操作。

concat(str1,str2,str3...)會生成一個新的字串

3、正確語句

String sql = "select count(*) from tab_route where rname like concat('%',?,'%')";

三、MyBatis like 模糊查詢及關鍵字區分

在 MyBatis 中使用 like 模糊查詢,應注意關鍵字為:#{str},查詢子句為:

select * from table where name  like concat('%',#{name},'%');

而如果新增排序欄位,應注意關鍵字為:${str},查詢子句為:

select * from table where name  like concat('%',#{name},'%') order by ${id};

總結

本文分別對執行普通 SQL 語句以及使用 like 語句進行萬用字元模糊查詢遇到錯誤進行了剖析,並給出相應解決方案。同時補充了在 MyBatis 中對模糊查詢的操作以及不同關鍵字的區分。程式碼之路漫漫,望諸君細緻。

在這裡插入圖片描述


感謝大家的支援,我是白鹿,一個不懈奮鬥的程式猿。希望本貼能幫助到大家,歡迎大家的一鍵三連!如果還有什麼問題、建議或者補充可以留言在貼文下方,給予更多人幫助!
更多資訊微信搜尋公眾號【WDeerCode程式碼圈