MyBatis多对一查询的使用

一.抛出问题

  什么是多对一:  

  • 多个学生对应一个老师
  • 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!
  • 多个订单对应一个用户
  • 如果对于订单这边,就是一个多对一的现象,即从订单这边关联一个用户!

             

 

   如何在查询订单的时候带出用户表中的用户名?

 

 

 二.解决方式

  1.单查询属性映射:

  • 在订单表实体类中添加需要带出的用户属性
public class Order {
    private int id;
    private int userId;
    //添加要带出的用户账户属性
    private String userAccount;
    private String orderNo;
    private String orderDate;
    private String consignee;
    private String phoneNum;
   
    //以下省略若干属性与get set方法

}
  • 在查询时,要查询两张表的信息,使用resultType即可 
<select id="getById" resultType="Order">
        <!--此处的 useraccount列要取别名与订单Order中添加的属性名一致-->
        select o.*,u.account useraccount from mall_order o,mall_user u where o.id=#{id} and o.userid=u.id
    </select>
  

 

  2.单查询类型映射:

  • 在订单表实体类中,添加用户实体类型作为属性
public class Order {
    private int id;
    private int userId;
    //添加User类型作为属性
    private User user;
    private String orderNo;
    private String orderDate;
    private String consignee;
    private String phoneNum;
   
    //以下省略若干属性与get set方法

}

  在查询时,查询两张表信息,使用resultMap,映射对应属性

<select id="getById" resultMap="OrderResultMap">
        select o.*,u.account from mall_order o,mall_user u where o.id=#{id} and
        o.userid=u.id
    </select>
    <resultMap id="OrderResultMap" type="Order">
    <id column="id" property="id"/>
    <result column="userid" property="userId"/>
    <result column="orderno" property="orderNo"/>
    <result column="orderdate" property="orderDate"/>
    <result column="consignee" property="consignee"/>
    <result column="phonenum" property="phoneNum"/>
   <!--从user表中查到的account赋值给Order,User类的属性值-->
    <result column="account" property="user.account"/>
    </resultMap>

  3.嵌套查询(查订单<多的一方>中嵌套用户信息查询) 关联映射

  • 首先在UserMapper.xml 应存在用户查询语句
<select id="getById" resultType="User">
        select * from mall_user where id=#{id}
    </select>
  • 在订单表实体类中,添加用户实体类型作为属性
public class Order {
    private int id;
    private int userId;
    //添加User类型作为属性
    private User user;
    private String orderNo;
    private String orderDate;
    private String consignee;
    private String phoneNum;
   
    //以下省略若干属性与get set方法

}
  • 查询时只需查多的一方,使用association 标签嵌套select子句
<select id="getOrders" resultMap="OrderResultMap">
    select * from mall_order;
</select>
<resultMap id="OrderResultMap" type="Order">
    <id column="id" property="id"/>
    <result column="userid" property="userId"/>
    <result column="orderno" property="orderNo"/>
        <!--property,映射到结果的属性,此处映射到订单实体类中的User类属性-->
        <!--column,数据库中的列名,或者是列的别名,传递给嵌套 Select 查询语句的列名-->
        <!--fetchType,有效值为lazy 和 eager,置为lazy时,代表需要property中的值才调用嵌套select-->
        <!--select,嵌套查询子句,namesapce.id-->
        <association property="user" column="userid" fetchType="lazy" select="com.woniu.mall.dao.UserDAO.getById" />
    </resultMap>

 

posted @ 2020-06-16 21:29  木子李和三点水  阅读(197)  评论(0编辑  收藏  举报