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注入的風險。
關於${}和#{}的區別,可以學習博客:
注意
有博客寫的是利用#{}直接傳入解析,示例代碼如下:
<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中的#{}不允許字符串拼接。