开发者

Mybatis中foreach的使用详解

目录
  • 一、foreach 属性使用
  • 二、代码使用         
    • 1、实体类 list<String>  mchntCds
    • 2、实体类 list<User>  userlist,实体类中有 list 属性
    • 3、数组  String[] params     
    • 4、传入的参数是实体类,并且实体中包含数组和集合
    • 5、传入多个list或者array,不使用实体进行封装。用注解@Params, collection使用到Param中定义的别名
    • 6、map参数
  • 三、总结
    • 扩展:MyBATis中foreach的使用

      一、foreach 属性使用

      <foreach collection="list" index="index" item="mchntCd" open="(" close=")" separator=",">
         #{mchntCd}
      </foreach>
      • item:  集合中元素迭代时的别名,该参数为必选,通过别名进行取值
      • index:在list和数组中,index是元素的序号,在map中,index是元素的key,非必填
      • open: foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。非必填
      • separator:元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。非必填
      • close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。非必填
      • collection: 要做foreach的对象,作为入参
        • 传入是集合,也就是接口里面用的  List<String> nameList    那么 使用 collection = “list”
        • 传入的是数组,接口里面 String[] namestrs ,那么 使用 collection = “array”
        • 如果传入的是一个实体bean,实体bean里面有一个属性为 list<String> ids 那么collection = “ids ”,如果实体bean中对应ids是一个对象,ids 里面有一个属性为 List<Stirng> usernames,那么collection = “ids.usernames”

      二、代码使用         

      1、实体类 list<String>  mchntCds

       mapper接口  ---》 list方式

      int queryDiscDerateCount(List<String> mchntCds);

      mapper映射XML:

      <select id="queryDiscDerateCount"  resultType="Integer">
         select count(*) from t_mchnt_disc_config  where mchnt_cd in
         <foreach collection="list" index="index" item="mchntCd" open="(" close=")"  separator=",">
            #{mchntCd}
         </foreach>
      </select>

      2、实体类 list<User>  userlist,实体类中有 list 属性

      实体类:

      @Data
      public class MchntDiscDerateDto {
         private String mchntCd = "";
      }

      mapper接口

      List<TMchntDerateInfoDto> getDiscDerateList(List<MchntDiscDerateDto> discDto);

      mapper映射xml:

      <select id="getDiscDerateList" parameterType="MchntDiscDerateDto" resultType="TMchntDerateInfoDto">
         select
          pythont_mchnt_disc_derate_config
            where
               mchnt_cd in
               <foreach collection="list" index="index" item="user" open="(" close=")" separator=",">
                  #{user.mchntCd}
       python        </foreach>
      </select>

      3、数组  String[] params     

      用 array 

      mapper 接口

      int queryDiscDerateCount(String[] mchntCds);

      mapper映射xml:

      <select id="queryDiscDerateCount"  resultType="Integer">
         select count(*) from t_mchnt_disc_derate_config where mchnt_cd in
         <foreach collection="array" index="index" item="mchntCd" open="(" close=")" separator=",">
            #{mchntCd}
         </foreach>
      </select>

      4、传入的参数是实体类,并且实体中包含数组和集合

      实体类:

      @Data
      public class UserVo {
          private Long id;
          private Long supplierId;
          private Long[] ids;
          private List<Long> clientIdList;
      }

      mapper接口

      List<UserVo> queryList(UserVo select);

      mapper映射文件xml

          <select id="queryList" resultType="UserVo" parameterType="UserVo"&编程gt;
              select *
              from bms_bills_memo
              <where>
              and id in
              <foreach collection="ids" open="(" close=")" item="id" separator=",">
                  #{id}
              </foreach>
              and
              client_id in
              <foreach collection="clientIdList" separator="," item="detail" open="(" close=")" >
                  #{detail}
              </foreach>
              </where>
          </select>

      5、传入多个list或者array,不使用实体进行封装。用注解@Params, collection使用到Param中定义的别名

      mapper接口

      List<UserVo> queryList(@Param("idArray") Long[] array, @Param("clientIdList") List<Long> list);

      mapper映射文件xml

          <select id="queryList" resultType="UserVo">
              select *
              from t_user_inf
              <where>
                  and id in
                  <foreach collection="idArray" open="(" close=")" item="id" separator=",">
                      #{id}
                  </foreach>
                  and
                  client_id in
                  <foreach collection="clientIdList" separator="," item="detail" open="(" close=")" >
                      #{detail}
                  </foreach>
              </where>
          </select>

      6、map参数

      当我们传入的参数为 Map<String,Objject>的时候,那么能不能正常使用 foreach呢,答案是肯定的,因为对象也是类似于map结构啊

          /**
           *  map 获取数据
           * @param map
           * @return
           */
          List<SysUser> getUserByIds(Map<String,Object> map);
       
       
          // xml
          <select id="getUserByIds" resultMap="BaseResultMap">
          select
              <include refid="Base_Column_List" />
          from t_sys_user
          where status = #{status}
          and id in
          <foreach collection="ids" item="id" open="(" close=")" separator=",">
              #{id}
          </foreach>
        </select>

      实际调用:

           @Test
          public void testMapUsers() {
              Map<String,Object> params = new HashMap<>();
              params.put("status", "1");
              params.put("ids", Arrays.asList(1,2,3,4,5,6,7,8));
              List<SysUser> all = sysUserDao.getUserByIds(params);
              try {
                  System.out.println(new jsonMapper().writeValueAsString(all));
              } catch (JsonProcessingException e) {
                  e.printStackTrace();
              }
          }

      调用结果:

      Mybatis中foreach的使用详解

      三、总结

          1、mapper 接口中添加 @Param注解的场合,list,array将会失效;

          2、使用了 @Param注解 collection的内容需要使用Param中的别名来指定你需要用到的list或者array

      扩展:Mybatis中foreach的使用

      首先我们要明白的是foreach的本质就是把数据库能执行的sql在xml中按照一定语法来进行拼接,所以拼接之前,我们了解一下foreach标签中几个常见元素的作用

      1.collection

      ‌List或Array‌:如果传入的参数类型是List或Array,collection属性的默认值分别是list和array。如果需要自定义php集合名称。

      ‌Map‌:如果传入的参数是Map,collection属性可以指定遍历Map的keys、values或entrySet

      2.item

      集合遍历中每一个元素的别名

      3.open

      拼接sql时最前面拼接的字符串

      4.separator

      拼接sql时候两个元素之间的分隔字符串

      5.close

      拼接sql时最后面拼接的字符串

      6.index

      index&编程客栈zwnj;:在List或Array中,index为元素的序号索引;在Map中,index为遍历元素的key值。

      举一个简单的例子

      一个简单的sql

      select * from blog where title is not null and (id=1 or id=2 or id=3)

      1.我们使用map集合作为参数实现拼接

      <select id="queryBlogForeach" parameterType="map" resultType="blog"> select * from blog <where> title is not null <foreach collection="ids" item="id" open="and (" separator="or" close=")"> id=#{id} </foreach> </where> </select>

      2.我们使用list集合作为参数实现拼接

      <select id="queryBlogForeach2" parameterType="list" resultType="blog"> select * from blog <where> title is not null <foreach collection="list" item="id" open="and (" separator="or" close=")"> id=#{id} </foreach> </where> </select>

      到此这篇关于Mybatis中foreach的使用的文章就介绍到这了,更多相关Mybatis foreach使用内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜