MyBatis(Parameter ‘XXX’ not found)
在今天的工作中,使用了MyBatis這個框架進行查詢,但是在使用時遇見了一個問題:具體的需求是這樣的,因爲公司項目的需求,我需要做一個查詢,這個查詢是結合了模糊查詢和IN查詢;這個模糊查詢的條件是一個String類型,而IN查詢的參數則是一個Set集合。在剛開始的時候,我在Mapper.class中聲明如下
public List<ApiManager> getByName(String companyName,Set<Integer> set);
然後我在Mapper.xml中做了如下的配置
<select id="getByName" resultMap="apimanagermap">
select <include refid="common"></include> from api_manage
where CompanyName like CONCAT(CONCAT('%',#{companyName}),'%')
and Id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
結果沒想到程序一運行,我執行查詢時,就出Bug了,這個報錯的信息如下
org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found.
看到這裏,我想你就明白這是什麼問題了:這個是由於在執行sql的時候無法匹配sql語句的通配符造成的。面對這樣的問題如何修改,尤其是當我們遇見多參數時,該如何去處理參數,才能正確的執行查詢呢,在這裏我推薦一種方式,我個人覺得比較方便:那就是把參數封裝成Map,在使用Hibernate時,我也會根據具體情況把參數封裝成Map來做一個動態的條件查詢。於是乎,我的代碼就變成了下面的形式
Mapper.class:
public List<ApiManager> getByName(Map<String, Object> map);
Mapper.xml
<select id="getByName" resultMap="apimanagermap">
select <include refid="common"></include> from api_manage
where Id
in
<foreach item="item" index="index" collection="set" open="(" separator="," close=")">
#{item}
</foreach>
and
CompanyName like CONCAT(CONCAT('%',#{companyName}),'%')
</select>
其實查詢的數據庫代碼沒怎麼做修改,只是先查了一下主鍵,減少查詢範圍,這樣能提高一下查詢的效率。在Service層調用這個Mapper中的方法時,把查詢的參數先封裝成一個Map,這個Map的鍵和查詢的條件名要相同。