9.MyBatis 关联映射(多对多)

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();
   }

小结

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

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

resultType:

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

resultMap:

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

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

时间: 2024-10-10 06:59:50

9.MyBatis 关联映射(多对多)的相关文章

Mybatis关联映射

Mybatis是半自动化的ORM框架,相比于Hibernate具有更好的灵活性,更容易进行性能优化,当然Hibernate和Mybatis各具特点,并不存在技术的优劣问题,只是应用场景不同,对于一个优秀的开发人员来说最好二者的技术都能掌握.Mybatis需要程序员完成实体类属性和数据库表字段之间的映射设计,并可以定制化返回类型,因此具有更高的灵活性,设计数据库表间的关联映射是Mybatis的核心,本文主要描述Mybatis进行表间关联映射设计的基本内容,包括完成一对一.一对多.多对多常见关联关系

顺藤摸瓜【Nhibernate 关联映射--多对一】

现有两个实体,Dog 和 Master ,映射到数据库表中如上图所示.一个Dog只允许对应一个Master,但一个Master可以有多个Dog.我们在查询Dog的时候,往往还需要知道其主人Master的信息,也就是说,如果已知一个Dog的信息,想一次来顺藤摸瓜找到Master的信息,此时用Nhibernate如何去实现呐?这里就用到了多对一的关联映射方法.看我是如何实现的: Nhibernate的整个搭建过程就不在赘述了,前面的两篇文章都已经详细展示了一下,下面仅仅展示多对一的实现方法. 首先构

SSM学习08MyBatis关联映射多对多

和上一个相同还是<collection>是多对多映射,一个订单可能包含多个产品,而每个商品有可能出现在多个订单中,在数据库中这样的情况就需要一张中间表来维护. 1.在mybatis中建表: 1 create table tb_product( 2 id int(32) primary key auto_increment, 3 name varchar(32), 4 price double 5 ); 6 7 insert into tb_product values('1','Java基础入

Hibernate关联映射多对多关联

在关系数据库中还有一种常见的关系,即多对多关联,下面以地址和人之间的关系来说明多对多关联,一个人可以去很对地方,同时,一个地址可以有多个人同时存在,因此,地址和人的关系可以看成是多对多的关系,地址(address)的结构表如图所示: 人(person)的结构表如图所示: 建立他们的多对多关联必须建立中间表(person_address),建立视图可以看到他们的多对多关系图如图所示: 在Hibernate中配置address和person表的多对多关联 1.新建一个项目工程 2.为工程添加Hibe

mybatis 关联映射传递多参数方法

<resultMap type="com.secoo.my.bean.OrderItemComment" id="orderItemResult">  <id column="id" property="id"/>  <result column="_productCode" property="productCode"/>  <result c

MyBatis 系列五 之 关联映射

MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultMap type="Dept" id="deptMapper"> <id property="deptNo" column="deptNo"/> <result property="deptName

Hibernate之关于多对多双向关联映射

[Hibernate]之关于多对多双向关联映射 多对多的双向关联映射在项目实战中还是相当重要的,所以这里着重写一下!以学生表(Student)和老师表(Teacher)为例. 首先我们还是先看Annotations配置! @Entity @Table(name="t_student") public class Student {     private Integer id;     private String name;     private Integer age;     

008多对一 关联映射 --- many-to-one

多对一 --- many-to-one 一对多 --- one-to-many 一对一 --- one-to-one 多对多 --- many-to-many 场景:用户和组:从用户角度来,多个用户属于一个组(多对一 关联) 使用hibernate开发的思路:先建立对象模型(领域模型),把实体抽取出来. 目前两个实体:用户和组两个实体,多个用户属于一个组,那么一个用户都会对应于一个组,所以用户实体中应该有一个持有组的引用. 关联映射的本质: 将关联关系映射到数据库,所谓的关联关系是对象模型在内存

mybatis关联查询问题(一对多、多对一)

mybatis 提供了高级的关联查询功能,可以很方便地将数据库获取的结果集映射到定义的Java Bean 中.下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的. 设计一个简单的博客系统,一个用户可以开多个博客,在博客中可以发表文章,允许发表评论,可以为文章加标签.博客系统主要有以下几张表构成: Author表:作者信息表,记录作者的信息,用户名和密码,邮箱等. Blog表   :  博客表,一个作者可以开多个博客,即Author和Blog的关系是一对多.