mybatis多对多关联查询——(十)

1.需求

查询用户及用户购买商品信息。

2     sql语句

查询主表是:用户表

关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:

orders、orderdetail、items

 

SELECT

  orders.*,

  USER.username,

  USER.sex,

  USER.address,

  orderdetail.id orderdetail_id,

  orderdetail.items_id,

  orderdetail.items_num,

  orderdetail.orders_id,

  items.name items_name,

  items.detail items_detail,

  items.price items_price

FROM

  orders,

  USER,

  orderdetail,

  items

WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id

 

3     映射思路

将用户信息映射到user中。

在user类中添加订单列表属性List<Orders> orderslist,将用户创建的订单映射到orderslist

在Orders中添加订单明细列表属性List<OrderDetail>orderdetials,将订单的明细映射到orderdetials

在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items

 

User.java

 

Orders.java

Orderdetail.java

Items.java

 

 

4     mapper.xml

 

5    resultMap定义

<!-- 查询用户及购买的商品 -->
    <resultMap type="cn.itcast.mybatis.po.User" id="UserAndItemsResultMap">
        <!-- 用户信息 -->
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
        
        <!-- 订单信息
        一个用户对应多个订单,使用collection映射
         -->
         <collection property="ordersList" ofType="cn.itcast.mybatis.po.Orders">
             <id column="id" property="id"/>
             <result column="user_id" property="userId"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>
            
             <!-- 订单明细
         一个订单包括 多个明细
          -->
              <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
                      <id column="orderdetail_id" property="id"/>
                     <result column="items_id" property="itemsId"/>
                     <result column="items_num" property="itemsNum"/>
                     <result column="orders_id" property="ordersId"/>
                     
                     <!-- 商品信息
              一个订单明细对应一个商品
               -->
                   <association property="items" javaType="cn.itcast.mybatis.po.Items">
                       <id column="items_id" property="id"/>
                       <result column="items_name" property="name"/>
                       <result column="items_detail" property="detail"/>
                       <result column="items_price" property="price"/>
                   </association>
                     
              </collection>
              
                       
         </collection>
        
    
    </resultMap>

 

 

 

 总结:

  一对一的在外键中添加主键对象为其属性,查询的时候外键表为主查询表。比如订单表对用户是一对一,订单中有用户的id为外键,查询的时候在订单中添加一用户属性。然后通过resultMap(单个对象映射用association)或通过Pojo封装进行一对一查询。

  一对多的在一个里面添加多个为List属性,比如订单与订单明细为一对多,在订单中添加一个 private List<Orderdetail> orderdetails; 属性,最后用resultMap进行映射,list用collection映射

  多对多拆分为两个一对多,分析过程与映射过程与上面一样。

 

 

 

补充:例如:一个角色和权限的对应关系:  (查询角色信息)

 

 角色中添加角色权限集合,角色权限中添加权限属性。

角色bean(添加角色权限集合)

public class Role {
    private String roleid;

    private String rolename;

    private String rolestatus;

    private String description;

    private String insituteid;

    private String isuse;

    private String remark;

    private List<Rolepermission> rolepermissions;//角色权限集合
  。。。

 

角色权限bean(添加permission属性)

public class Rolepermission {
    private Integer rolepermissionid;

    private String roleid;

    private String permissionid;

    private Permission permission;
    
    ..
}

 

 

 

Mapper映射

 

    <!--1.组合条件分页查询角色信息-->
    <!--1.1结果集映射-->
    <resultMap id="RolePermissionResultMap" type="cn.xm.jwxt.bean.system.Role">
        <!--(1)角色信息-->
        <id column="roleID" property="roleid"></id>
        <result column="roleName" property="rolename"/>
        <result column="roleStatus" property="rolestatus"/>
        <result column="description" property="description"/>
        <!--(2)角色权限信息-->
        <collection property="rolepermissions" ofType="cn.xm.jwxt.bean.system.Rolepermission">
            <id column="rolePermissionId" property="rolepermissionid"></id>
            <!--(3)权限信息-->
            <association property="permission" javaType="cn.xm.jwxt.bean.system.Permission">
                <id column="permissionID" property="permissionname"></id>
                <result column="permissionStatus" property="permissionstatus"/>
            </association>
        </collection>
    </resultMap>
    <!--2.查询数据-->
    <select id="getRoleByCondition" parameterType="map" resultMap="RolePermissionResultMap">
        SELECT *
        FROM role
          LEFT JOIN rolepermission
            ON role.roleID = rolepermission.roleId
          LEFT JOIN permission
            ON rolepermission.permissionId = permission.permissionID
    </select>

 

posted @ 2017-08-06 18:57  QiaoZhi  阅读(1041)  评论(0编辑  收藏  举报