MyBatis In的使用

    项目中where条件中用到in,我理所当然的拼了个字符串传进去了,郁闷的是程序一直运行正常,测试case一直没有覆盖到这种情况,今天发现了,原来是程序的问题,我以为mybatis有bug呢。。。。。故记下此问题,留作笔记。

           


参考http://www.blogjava.net/xmatthew/archive/2011/08/31/355879.html


           1.解决方法(多参数)

               Map.xml

              

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <select id="getEntityList" resultType="App" parameterType="map">  
  2.     select * from t_app   
  3.     where status=#{status}  
  4.     <if test="flag!=null ">  
  5.         and id not in  
  6.         <foreach item="item" index="index" collection="ids" open="("  
  7.             separator="," close=")">  
  8.             #{item}  
  9.         </foreach>  
  10.     </if>  
  11. </select>  
          传入的参数为Map<String,Object>

          数据:status:1

                     ids:int[]{101,103,61,75}

 

         2.一个参数           

  •             a.如果参数的类型是List, 则在使用时,collection属性要必须指定为 list

                           findByIds(List<Long> ids)

                         

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <select id="findByIdsMap" resultMap="BaseResultMap">  
  2.   
  3.          Select  
  4.   
  5.          <include refid="Base_Column_List" />  
  6.   
  7.          from jria where ID in  
  8.                   <foreach item="item" index="index" collection="list"   
  9.                          open="(" separator="," close=")">  
  10.                         #{item}  
  11.                 </foreach>  
  12.   </select>   

  •            b.如果参数的类型是Array,则在使用时,collection属性要必须指定为 array

                     findByIds(Long[] ids)

                   

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <select id="findByIdsMap" resultMap="BaseResultMap">  
  2.                 select  
  3.                 <include refid="Base_Column_List" />  
  4.          from jria where ID in  
  5.                  <foreach item="item" index="index" collection="array"   
  6.                         open="(" separator="," close=")">  
  7.                        #{item}  
  8.                </foreach>  
  9.  </select>   
MyBatis 中,使用 `in` 条件查询时,如果查询结果集很大,可能会导致分页失效。这是因为 `in` 中的条件数量过多,导致 SQL 语句执行效率变慢,从而影响分页的结果。为了解决这个问题,可以采取以下两种方式: 1. 使用子查询代替 `in` 条件查询。 例如,原来的 SQL 语句是这样的: ```sql select * from table where column in (value1, value2, ..., valueN) limit offset, pageSize ``` 可以改为: ```sql select * from table where column in (select column from table where column in (value1, value2, ..., valueN) limit offset, pageSize) ``` 这样做的效果是先使用子查询获取满足条件的列,再使用主查询获取满足条件的行。这样可以避免 `in` 条件查询中条件数量过多的问题。 2. 将 `in` 条件查询拆分成多个小的查询。 例如,如果原来的 SQL 语句是这样的: ```sql select * from table where column in (value1, value2, ..., valueN) limit offset, pageSize ``` 可以改为: ```sql select * from table where column in (value1, value2, ..., valueM) limit offset, pageSize union select * from table where column in (valueM+1, valueM+2, ..., valueN) limit offset, pageSize ``` 这样做的效果是将 `in` 条件查询拆分成多个小的查询,每个小的查询中条件数量不会过多,从而避免了 SQL 语句执行效率变慢的问题,保证了分页的正确性。 综上所述,为了避免 `in` 条件查询导致分页失效的问题,可以采用子查询或者将 `in` 条件查询拆分成多个小的查询的方式来解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值