MyBatis的坑(Parameter 'XXX' not found)

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的鍵和查詢的條件名要相同。

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