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 使用指南和常见问题 #### 一、MyBatis 返回行数的技术要点 当利用 MyBatis 执行数据库操作并依赖返回的行数作为成功与否的标准时,需注意 MySQL 数据库默认配置下的行为可能导致误判。具体而言,在某些场景下,匹配行数与受影响行数之间的差异可能引发逻辑错误。为了确保应用稳定运行,建议启用 `useAffectedRows=true` 配置项以获取更精确的结果反馈[^1]。 如果因环境限制而无法设置此选项,则可以考虑采用事务管理机制或其他方式验证数据变更情况,以此规避潜在风险。 #### 二、ResultType 和 ResultMap 的区别 对于 CRUD 操作的支持,MyBatis 提供了两种不同的结果集映射模式——`resultType` 和 `resultMap`: - **resultType**: 直接指定 Java 类型名称用于表示每条记录的数据结构; - **resultMap**: 定义更为复杂的字段到属性间的转换关系,适用于表结构复杂或多表联查的情形; 选择合适的映射策略有助于提高开发效率及程序可维护性[^2]。 #### 三、SQL 动态拼接与安全防护措施 为了避免手动构建 SQL 字符串过程中可能出现的安全隐患(如注入攻击),推荐使用 MyBatis 内建的功能实现动态查询条件组装。例如,借助 `<if>` 或者 `<choose>` 等标签控制语句片段的选择性加入,既简化编码又增强了安全性[^3]。 此外,针对输入参数应始终采取适当的方式进行转义处理,比如通过 `${}` 插值表达式代替直接嵌入变量值的做法已被证明存在极大漏洞,应当予以摒弃。相反地,`${}` 应仅限于那些确实需要被解析成原始文本的内容上,而对于大多数场合来说,应该优先选用带有预编译特性的 `#{}` 占位符语法[^4]。 ```java // 正确做法:使用 #{} public List<User> selectUsers(@Param("name") String name); ``` #### 四、多租户架构下的特殊需求满足 在现代企业级项目中,经常会遇到多个客户共享同一套物理存储资源的情况,即所谓的“多租户”。此时可以通过自定义插件或拦截器等方式向每次请求附加额外的身份标识信息,从而达到隔离不同用户组之间访问权限的目的。以 MyBatis-Plus 为例,默认实现了基于 `app_code` 字段过滤的目标表格记录功能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值