做项目是遇到的问题:
举例如下:
delete from ResultPushMsg where id in (‘1’,‘2’);
在sql查询器中可以正确执行,但在MyBatis中的使用,却报错

 @Delete("delete from ResultPushMsg where id in #{successId} ")
 void deleteSuccessId(@Param("successId")String successId);

其中 id in (‘1’,‘2’);这样的写法,看似很简单,但是MyBatis不支持。但是MyBatis中提供了foreach语句实现IN查询,foreach语法如下:


foreach语句中, collection属性的参数类型可以使:List、数组、map集合
​     collection: 必须跟mapper.java中@Param标签指定的元素名一样
​     item: 表示在迭代过程中每一个元素的别名,可以随便起名,但是必须跟元素中的#{}里面的名称一样。
   index:表示在迭代过程中每次迭代到的位置(下标)
   open:前缀, sql语句中集合都必须用小括号()括起来
​     close:后缀
   separator:分隔符,表示迭代时每个元素之间以什么分隔

一、 当查询的参数为一个时

(1)、如果参数的类型是Array,在使用时,collection属性要必须指定为 array。
void insertImport(String[] ids);

  @Insert(" <script> insert into nipt select * from nipt_temp where n_id in " +
            " <foreach collection='array' item='n_id' index='index' open='(' close=')' separator=',' > " +
            "   #{n_id}  " +
            "</foreach> </script> ")
  void insertImport(String[] ids);

(2)、如果参数的类型是List, 在使用时,collection属性要必须指定为 list
List selectByIdSet(List ids);

@Select(" <script> select * from nipt_temp where n_id in " +
            " <foreach collection='list' item='n_id' index='index' open='(' close=')' separator=',' > " +
            "   #{n_id}  " +
            "</foreach> </script> ")
List<User> selectByIdSet(List ids);

二、有多个查询参数时
当查询的参数有多个时,有两种方式可以实现,一种是使用@Param(“xxx”)进行参数绑定(collection属性可以指定名称),另一种可以通过Map来传参数。

--sqlserver2005,2008通用
@Insert("<script> INSERT INTO pushHistory (id,openId,patientId,tid,first,keyword) " +
            " <foreach collection='result' item='item' index='index' > \n" +
            " select #{item.id},#{item.openId},#{item.patientId},#{item.tid},#{item.first},#{i} " +
            " <if test='index != (result.size() - 1)'> union all </if>" +
            " </foreach> </script> ")
void insertBatchHistory(@Param("result")List<ListResult> result,@Param("i")int i);

--sqlserver2008
@Insert("<script> INSERT INTO pushHistory (id,openId,patientId,tid,first,keyword) VALUES " +
            " <foreach collection='result2' item='item' separator=',' > \n" +
            " (#{item.id},#{item.openId},#{item.patientId},#{item.tid},#{item.first},#{i} ) " +
            " </foreach> </script> ")
void insertBatchHistory(@Param("result")List<ListResult> result,@Param("i")int i);

Map方式
Map<String, Object> params = new HashMap<String, Object>(2);
params.put(“name”, name");
params.put(“idList”, list);

 @Select(" <script> select * from nipt_temp where n_id in " +
            " <foreach collection='idList' item='n_id' index='index' open='(' close=')' separator=',' > " +
            "   #{n_id}  " +
            "</foreach> and n_name=#{name} </script> ")
    List<NIPT> insertImport(Map<String, Object> params);
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐