【Mybatis】項目開發中模糊查詢LIKE的四種實現及注意點

MySQL的LIKE關鍵字在開發中經常用到,那麼在使用Mybatis的情況下有哪幾種方式實現模糊查詢呢?

Mybatis中的模糊查詢實現

1. 直接傳參法——在程序中拼接

  /* 構造查詢參數 */
  Map<String, Object> params = new HashMap<>();
  String keyword= new StringBuilder("%").append(parameter).append("%").toString();
  params.put("keyword", keyword);

在mapper映射文件的語句對應的語法則是:

<select id="selectCommodity" parameterType="java.util.Map" resultMap="BaseResultMap">
       SELECT c.sku_id,c.price FROM cps_commodity_info c
       WHERE c.ldelete_flag = 0
       <if test="keyword != null">
           AND c.sku_name LIKE #{keyword}
       </if>
   </select>

2. 利用Mybatis的bind

先附上程序中的實現:

  /* 構造查詢參數 */
  Map<String, Object> params = new HashMap<>();
  params.put("keyword", keyword);

再附上mapper映射文件中的SQL語句:

<select id="selectCommodity" parameterType="java.util.Map" resultMap="BaseResultMap">
       <bind name="parameter" value="'%'+keyword+'%'"></bind>
       SELECT c.sku_id,c.price FROM cps_commodity_info c
       WHERE c.ldelete_flag = 0
       <if test="keyword != null">
           AND c.sku_name LIKE #{parameter}
       </if>
   </select>

Tips:
如果報錯

Cause: org.xml.sax.SAXParseException;  必須聲明元素類型 "bind"`

說明Mybatis版本過低,需要升級版本。

3. 利用MySQL的字段串拼接函數CONCAT:

SELECT c.sku_id,c.price FROM cps_commodity_info c WHERE c.sku_name LIKE CONCAT(CONCAT('%',#{keyword}),'%');

如果採用 concat(a, b, c)直接拼接可能會報“參數個數無效”。

4. 採用${}直接拼接

SELECT c.sku_id,c.price FROM cps_commodity_info c WHERE c.sku_name LIKE '%${keyword}%'; 

注意:由於$ {}是參數直接注入拼接的,所以使用這種寫法的時候,在$ {}大括號裏面不能註明jdbcType,不然會報錯。

該方式筆者極其不推薦,因爲有SQL注入的風險。
關於${}和#{}的區別,可以學習博客:

【Mybatis】佔位符#{}和${}的區別

注意

有博客寫的是利用#{}直接傳入解析,示例代碼如下:

<select id="selectCommodity" parameterType="java.util.Map" resultMap="BaseResultMap">
       SELECT c.sku_id,c.price FROM cps_commodity_info c
       WHERE c.ldelete_flag = 0
       <if test="keyword != null">
           AND c.sku_name LIKE "%"#{keyword,jdbcType=VARCHAR}"%"
       </if>
   </select>

但其實這種方式是錯的,因爲Mybatis中的#{}不允許字符串拼接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章