隐藏

MyBatis框架collection属性和collection标签的用法详细介绍

发布:2022/3/24 10:17:43作者:管理员 来源:本站 浏览次数:890

1、collection属性用法介绍


collection属性归属于foreach标签的属性,通常用于查询之前的SQL参数映射,而collection标签则用于查询之后的结果之间的关联映射。


foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。


foreach元素的属性主要有 item,index,collection,open,separator,close。其含义如下所示:


item,表示集合中每一个元素进行迭代时的别名

index,指定一个名字,用于表示在迭代过程中,每次迭代到的位置

open,表示该语句以什么开始

separator,表示在每次进行迭代之间以什么符号作为分隔符

close,表示以什么结束


在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有以下三种情况:


(1)如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

(2)如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

(3)如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成Map,实际上如果你在传入参数的时候,在mybatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key


下面分别来看看上述三种情况的示例代码:


单参数List的类型:


   <select id="getBlogs" parameterType="java.util.List" resultType="Blog">

       select * from t_blog where id in

       <foreach collection="list" index="index" item="item" open="(" separator="," close=")">

                   #{item}

       </foreach>

   </select>


上述collection的值为list,对应的Mapper是这样的:


   public List getBlogs(List ids);


测试代码如下所示:


   SqlSession sqlSession = sqlSessionFactory.openSession();

   BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);

   List ids = new ArrayList();

   ids.add(1);

   ids.add(3);

   ids.add(6);

   List blogs = blogMapper.getBlogs(ids);

   for (Blog blog : blogs)

   {

       System.out.println(blog);

   }

   sqlSession.close();


单参数array数组的类型:


   <select id="getBlogs" parameterType="java.util.ArrayList" resultType="Blog">

       select * from t_blog where id in

       <foreach collection="array" index="index" item="item" open="(" separator="," close=")">

           #{item}

       </foreach>

   </select>


上述collection为array,对应的Mapper代码:


   public List getBlogs(int[] ids);


对应的测试代码:


   SqlSession sqlSession = sqlSessionFactory.openSession();

   BlogMapper blogMapper = session.getMapper(BlogMapper.class);

   int[] ids = new int[] {1,3,6,9};

   List blogs = blogMapper.getBlogs(ids);

   for (Blog blog : blogs)

   {

       System.out.println(blog);

   }

   session.close();


自己把参数封装成Map的类型:


   <select id="getBlogs" parameterType="java.util.HashMap" resultType="Blog">

       select * from t_blog where title like "%"#{title}"%" and id in

       <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">

           #{item}

       </foreach>

   </select>


上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:


   public List getBlogs(Map params);


对应测试代码:


   SqlSession sqlSession = sqlSessionFactory.openSession();

   BlogMapper blogMapper = session.getMapper(BlogMapper.class);

   final List ids = new ArrayList();

   ids.add(1);

   ids.add(2);

   ids.add(3);

   ids.add(6);

   ids.add(7);

   ids.add(9);

   Map params = new HashMap();

   params.put("ids", ids);

   params.put("title", "历史");

   List blogs = blogMapper.getBlogs(params);

   for (Blog blog : blogs)

   {

       System.out.println(blog);

   }

   session.close();


2、collection标签用法介绍


collection标签是集合标签,它与association关联标签几乎是一样的,它们相似的程度之高,常常让人产生误解。关联association标签处理“一对一”类型的关系,例如:一个博客有一个用户。


   public Class Blog

   {

       private Author author;

   }


但一个博客有很多文章(Post),collection标签处理“一对多”类型的关系,这可以用下面的写法来表示:


   public Class Blog

   {

       private List<Post> posts;

   }


collection标签和association标签的用法非常相似,区别在于ofType属性:


   <association property="author" javaType="Author">


   <collection property="posts" javaType="ArrayList" ofType="Post" />