1.查询多对多

    

        需求:

                查询用户购买的商品,包括用户信息,订单信息,订单详细信息,商品信息

    

     SQL语句:

        

SELECT 
      user.id,user.username,user.address,
      orders.iduser_orders_id,orders.number,orders.note,
      orderdetail.idorderdetail_id,orderdetail.items_id,orderdetail.items_num,
      items.nameitems_name,items.detail items_detail 
FROM 
      user,orders,orderdetail,items 
WHERE 
      user.id = orders.user_id 
      AND orders.id = orderdetail.orders_id 
      ANDorderdetail.items_id = items.id;

    

        修改domain类(UserMapper.java)

package cn.mybatis.mapper.domain;
 
import java.util.List;
 
/**
 * 用户的扩展类
 * @author刘泽栋
 * @date 2015年6月22日下午1:45:15
 */
publicclass UserExt extends User {
 
    // 这里定义User类的扩展属性
    // 一个用户下有多个订单
    public List<OrdersExt> orders;
 
    public List<OrdersExt> getOrders(){
        returnorders;
    }
 
    publicvoidsetOrders(List<OrdersExt>orders) {
        this.orders = orders;
    }   
}

    

        在OrdersExt类中添加List<OrderdetailExt>属性(OrdersExt.java)

publicclass OrdersExt extends Orders {
    /**
     * 添加用户的属性
     */
    private String username;
    private String sex;
    private String address;
    
    // 用户信息
    private User user;
    // 订单明细
    private List<OrderdetailExt> detailList;

        

        编写mapper接口 (UserMapper.java)

//多表查询,查询用户信息,包括订单信息,订单明细,购买商品信息
publicList<UserExt> findUserByItems();


        编写映射文件(UserMapper.xml)

<!--定义userItemsResultMap,包括用户信息,包括订单信息,订单明细,购买商品信息 -->
   <resultMap type="UserExt" id="userItemsResultMap">
      <id column="id" property="id"/>
      <result column="username" property="username"/>
      <result column="address" property="address"/>
 
      <!-- 一个用户有多个订单 -->
      <collection property="orders" ofType="OrdersExt">
         <id column="user_orders_id" property="id" />
         <result column="number" property="number"/>
         <result column="note" property="note"/>
 
         <!-- 一个订单有多个明细 -->
         <collection property="detailList" ofType="OrderdetailExt">
            <id column="orderdetail_id" property="id" />
            <result column="items_id" property="itemsId"/>
            <result column="items_num" property="itemsNum"/>
 
            <!-- 一个订单下面有一个商品信息 -->
            <association property="items" javaType="items">
                <id column="items_name" property="name" />
                <result column="items_detail" property="detail" />
            </association>
         </collection>
      </collection>
 
 
 
   </resultMap>
 
   <!-- 查询用户信息,多表查询,查询用户信息,包括订单信息,订单明细,购买商品信息 -->
   <select id="findUserByItems" resultMap="userItemsResultMap">
      SELECT
      user.id,user.username,user.address,
      orders.id user_orders_id,orders.number,orders.note,
      orderdetail.idorderdetail_id,orderdetail.items_id,orderdetail.items_num,
      items.name items_name,items.detailitems_detail
      FROM
      user,orders,orderdetail,items
      WHERE
      user.id = orders.user_id
      AND orders.id = orderdetail.orders_id
      AND orderdetail.items_id = items.id
   </select>


    

        编写测试代码(UserMapperTest.java)

/**
    * 测试多表查询
    * 多表查询,查询用户信息,包括订单信息,订单明细,购买商品信息
    */
   @Test
   publicvoidfindUserByItemsTest() throws Exception {
      SqlSession sqlSession = sqlSessionFactory.openSession();
      UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
      
      List<UserExt> listUser = userMapper.findUserByItems();
      System.out.println(listUser);
      
      sqlSession.close();
   }


    

小结

一对多是多对多的一个特例。

一对多的使用方式中,resultTyperesultMap各自有不同的应用场景:

resultType

      查询用户名称、用户性别、用户地址、商品名称、商品价格。

resultMap

      先查询用户信息,然后鼠标移动上去,显示商品明细信息。

 

resultMap的嵌套查询可以使用延迟加载的功能