zoukankan      html  css  js  c++  java
  • 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子元素中去。

  • 相关阅读:
    三次请求(读-改-读)引出nibernate 一级缓存
    算法竞赛入门经典第一、二章摘记
    uva 10905 Children's Game
    uva 11205 The broken pedometer
    uva 10160 Servicing stations
    uva 208 Firetruck
    uva 167 The Sultan's Successors
    zoj 1016 Parencodings
    uva 307 Sticks
    uva 216 Getting in Line
  • 原文地址:https://www.cnblogs.com/Struts-pring/p/7364692.html
Copyright © 2011-2022 走看看