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的键和查询的条件名要相同。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值