resultMap之collection聚集

    <select id="getCarsWithCollection" resultMap="superCarResult">
        select c1.carid,c1.cartype,c2.enginetype,c2.enginecylinders from cars c1,cars c2
        where c1.carid=c2.carid
    </select>
    <resultMap type="tk.mybatis.springboot.model.Brakes" id="brakesResult">
        <result column="brakesType" property="type"/>
    </resultMap>
    <resultMap type="tk.mybatis.springboot.model.SuperCar" id="superCarResult">
        <id column="carid" property="id"/>
        <result column="cartype" property="type"/>
        <association property="brakes" resultMap="brakesResult"/>
        <collection property="engines" javaType="ArrayList" ofType="tk.mybatis.springboot.model.Engine">
            <result column="enginetype" property="type"/>
            <result column="enginecylinders" property="cylinders"/>
        </collection>
    </resultMap>

聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载:

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活但会将执行多次嵌套的SQL语句。
2. resultMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

两种加载方式格式如下:

1.集合的嵌套查询(select)

<collection property="Java属性名" ofType="另一Java类名" javaType="ArrayList" column="关联主键ID(用于嵌套查询SQL语句传入参数,多个用逗号分开)" select="另一个select映射SQL的ID"/>

<select parameterType="int" resultType="另一Java类名" id="另一个select映射SQL的ID">

SQL语句

<select>

注意:column属性的值必须与相应的SQL查询语句中的列名相同。MyBatis会将第一条SQL语句查询出来的该列的值用于所嵌套的SQL映射语句的入参。因第一条SQL语句查询出来的每个该列的值都将用于执行另一个SQL语句,所以嵌套的SQL语句将被多次执行。

2.集合的嵌套结果(resultMap)

<collection property="Java属性名" ofType="另一Java类名" javaType="ArrayList" resultMap="另一个resultMap的ID"/>

<resultMap="另一个resultMap的ID" type="另一Java类名">

<id property="id" column="关联主键ID"/>

........

</resultMap>

注意:column属性的值必须与相应的SQL查询语句的列名一样。

集合的嵌套查询(select)示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">  

<mapper namespace="com.myapp.mapper.UserMapper">
  <select id="getUserList" resultMap="userdetailResult">
    select * from t_user where id between 1 and 10
  </select>
  <select id="selectRoles" resultType="com.myapp.domain.Role" parameterType="int">
    select * from t_user_role a,t_role b where a.user_id=#{id} and a.role_id=b.id
  </select>
  <resultMap id="userdetailResult"  type="User">
         <id property="id"  column="user_id" />
    <result property="name" column="user_name"/>
    <result property="createDate" column="create_date"/>
    <collection property="roles"  ofType="Role" javaType="ArrayList"  column="id" select="selectRoles"/>
  </resultMap>
</mapper>  

集合的嵌套结果(result)示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">  

<mapper namespace="com.myapp.mapper.UserMapper">
  <select id="getUserList" resultMap="userdetailResult">
    SELECT
        u.id as user_id,
        u.name as user_name,
        u.create_date,
        r.id as role_id,
        r.name as role_name
    FROM t_user u
    LEFT JOIN t_user_role ur ON(u.id=ur.user_id)
    LEFT JOIN t_role r ON(r.id=ur.role_id) where u.id=1
  </select>
  <resultMap id="userdetailResultNew"  type="User">
    <id property="id"  column="user_id" />
    <result property="name" column="user_name"/>
    <result property="createDate" column="create_date"/>
    <collection property="roles"  ofType="Role" javaType="ArrayList">
        <id property="id"  column="role_id"/>
        <result property="name"  column="role_name"/>
    </collection>
  </resultMap>
  <resultMap id="roleResult" type="Role">
    <id property="id"  column="role_id"/>
    <result property="name"  column="role_name"/>
  </resultMap>
  <resultMap id="userdetailResult"  type="User">
    <id property="id"  column="user_id" />
    <result property="name" column="user_name"/>
    <result property="createDate" column="create_date"/>
    <collection property="roles"  ofType="Role" javaType="ArrayList" resultMap="roleResult"/>
  </resultMap>
</mapper>  

如果你只是简单的嵌套,可以像id="userdetailResultNew" 那样将要嵌套的结果直接写在collection子元素中去。

时间: 08-29

resultMap之collection聚集的相关文章

Mybatis 高级结果映射 ResultMap Association Collection

作者:ilovejava_2010 MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的.虽然我们希望所有的数据库遵守第三范式或BCNF(修正的第三范式),但它们不是.如果有一个数据库能够完美映射到所有应用程序,也将是非常棒的,但也没有.结果集映射就是MyBatis为解决这些问题而提供的解决方案.例如,我们如何映射下面这条语句? <!-- Very Complex Statement --> <select id="selectBlogDetails"

关于mybatis中mapper文件resultMap中collection的使用

collection的使用有两种resultMap和select,必须手动指定一种 1. 实体类: 1 package com.mrlu.mybatis.domain; 2 3 import java.util.List; 4 5 /** 6 * Created by stefan on 15-12-31. 7 */ 8 public class User { 9 private Integer id; 10 private String name; 11 private List<Accoun

SQL语句映射文件(1)resultMap

SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: Xml代码 <mappers> <mapper resource="com/liming/manager/data/mappers/UserMapper.xml" /> <mapper resource="com/liming/manager/da

MyBatis collection的两种形式——MyBatis学习笔记之九

与association一样,collection元素也有两种形式,现介绍如下: 一.嵌套的resultMap 实际上以前的示例使用的就是这种方法,今天介绍它的另一种写法.还是以教师映射为例,修改映射文件TeacherMapper.xml如下(点击此处进入嵌套resultMap形式的示例源码下载页面.注:本示例代码是在修改本系列的上篇博文示例代码的基础上完成的,用到了MapperScannerConfigurer和注解等知识.对这些知识不熟悉的读者,可参考上篇博文:http://legend20

resultType、resultMap

resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中. 场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可. resultMap: 使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求). association: 作用: 将关联查询信息映射到一个pojo对象中.

difference between collection and association mapping in mybatis 3

Mybatis处理“一对多”的关系时,需要用到associasion元素.处理”多对一“用collection元素来实现(这两个元素在之前mapper文件中提到过). 本例子中,假设一名User可以有多个Orders,用associasion来实现关联关系 首先数据库表结构 CREATE TABLE `user` ( `id` int(8) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_bin NOT NULL, `us

23Mybatis_根据订单商品数据模型的练习对resultMap和resulttype的总结

resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中. 场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可. resultMap: 使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求). association: 作用: 将关联查询信息映射到一个pojo对象中.

21Mybatis_订单商品数据模型_一对多查询——resultMap方式

这篇文章延续订单商品数据模型,这张讲述的是一对多的查询.(用resultMap) 给出几张表的内容: User表: orders表: orderdetail表: orders表: items表: 在SQLyog中写一个sql语句 (先验证成功): SELECT   orders.*,  USER.username,  USER.sex,  USER.address,  orderdetail.id orderdetail_id,  orderdetail.items_id,  orderdeta

关联查询resultMap使用规则总结——(十一)

resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中. 场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可. resultMap: 使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求). association: 作用: 将关联查询信息映射到一个pojo对象中.