MyBatis高级映射(一对一映射、一对多映射、多对多映射)

一、什么是MyBatis高级映射

       mybatis是一个持久层框架,不完全的ORM(对象关系映射)框架。sql语句需要程序员自己去写,都是mybatis也有映射(输入参数映射,输出结果映射)。pojo通过映射数据库字段才能对数据进行增删改查操作,让程序员把精力放在写sql语句上,并对sql语句优化非常方便。即mapper.xml(映射文件)。

      1、输入映射:parameterType

            指定输入参数类型可以简单类型、pojjo、hashmap。对应综合查询,建议parameterType使用包装的pojo,有利于系统扩展。

      2、输出映射:

            1)resultType:查询到的列名和resultType指定的pojo的属性名一致,才能映射成功;

            2)resultMap:可以通过resultMap完成一些高级映射。如果查询的的列名和映射的pojo的属性名不一致时,通过resultMap设置列名和属性名之间的对应关系(映射关系),可以完成映射

      3、resultMap元素中,允许有以下直接子元素:

          1)constructor -- 类在实例化时,用来注入结果到构造方法中;作用与result相同,同时可以标识出用这个字段值可以区分其他对象实例。可以理解为数据表中的主键,可以定位数据表中唯一一笔记录;

          2)result -- 将数据表中的字段注入到Java对象属性中;

          3)association -- 关联,简单的讲,就是“有一个”关系,如“用户”有一个“帐号”;

          4)collection -- 集合,顾名思议,就是“有很多”关系,如“用户”有很多“订单”。

二、为什么用MyBatis高级映射

       在现实的项目中进行数据库建模时,我们要遵循数据库设计范式的要求,会对现实中的业务模型进行拆分,封装在不同的数据表中,表与表之间存在着一对多或是多对多的对应关系。进而,我们对数据库的增删改查操作的主体,也就从单表变成了多表。下面举例说明高级映射:

       1、一个用户可以创建多个订单,一对多;

       2、一个订单只由一个用户创建,一对一 ;

       3、一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系

       4、反过来多个订单明细对应一个订单,多对一关系;

       5、多个用户创建多个订单,多对多关系。

三、一对一映射

        1、pojo类

public class Order {
    private int id;
    private String name;
    private int number;
    private Account account;
    private List<OrderDetail> orderDetails;
}

public class OrderDetail {
    private int id;
    private int orderId;
    private int itemNumber;
    private String name;
}
public class Account {
    private String id;
    private String userName;
}

      2、Mapper映射文件

<select id="findOrder" resultMap="orderUserMap">
   SELECT
      tto.ID,
      tto.`NAME`,
      tto.NUMBER,
      tu.ID AS UID,
      tu.`NAME` AS USERNAME
   FROM
      t_t_order tto,
      t_user tu
   WHERE
      tu.ID = tto.CREATE_ID
</select>

<resultMap id="orderUserMap" type="com.fh.entity.Order">
   <id property="id" column="ID"/>
   <result property="name" column="NAME"/>
   <result property="number" column="NUMBER"/>
   <association property="account" javaType="com.fh.entity.Account">
      <id property="id" column="UID"/>
      <result property="userName" column="USERNAME"/>
   </association>
</resultMap>

四、一对多映射

       1、非继承Mapper文件

<resultMap id="orderDetailMap" type="com.fh.entity.Order">
   <id property="id" column="ID"/>
   <result property="name" column="NAME"/>
   <result property="number" column="NUMBER"/>
   <association property="account" javaType="com.fh.entity.Account">
      <id property="id" column="UID"/>
      <result property="userName" column="USERNAME"/>
   </association>
   <collection property="orderDetails" ofType="com.fh.entity.OrderDetail">
      <id property="id" column="DID"/>
      <result property="orderId" column="ORDER_ID"/>
      <result property="itemNumber" column="ITEM_NUMBER"/>
      <result property="name" column="DNAME"/>
   </collection>
</resultMap>

       2、继承Mapper文件

<resultMap id="orderDetailMapExtends" type="com.fh.entity.Order" extends="orderUserMap">
   <collection property="orderDetails" ofType="com.fh.entity.OrderDetail">
      <id property="id" column="DID"/>
      <result property="orderId" column="ORDER_ID"/>
      <result property="itemNumber" column="ITEM_NUMBER"/>
      <result property="name" column="DNAME"/>
   </collection>
</resultMap>

五、多对多映射

<resultMap id="userOrder" type="com.fh.entity.Account">
   <id property="id" column="ID"/>
   <result property="userName" column="USERNAME"/>
   <collection property="orders" ofType="com.fh.entity.Order">
      <id property="id" column="ORDER_ID"/>
      <result property="name" column="NAME"/>
      <result property="number" column="NUMBER"/>
      <collection property="orderDetails" ofType="com.fh.entity.OrderDetail">
         <id property="id" column="DID"/>
         <result property="name" column="DNAME"/>
         <result property="itemNumber" column="ITEM_NUMBER"/>
      </collection>
   </collection>
</resultMap>

<select id="findUserOrder" resultMap="userOrder">
   SELECT
      tr.ID AS ORDER_ID,
      tr.`NAME`,
      tr.NUMBER,
      tod.ID AS DID,
      tod.ITEM_NUMBER,
      tod.`NAME` AS DNAME,
      tu.ID,
      tu.`NAME` AS USERNAME
   FROM
      t_t_order tr,
      t_t_order_detail tod,
      t_user tu
   WHERE
      tod.ORDER_ID = tr.ID
   AND tu.ID = tr.CREATE_ID
</select>

猜你喜欢

转载自blog.csdn.net/qq_34479912/article/details/81288004