当前位置: 代码迷 >> 综合 >> MyBatis高级映射(一对一映射、一对多映射、多对多映射)
  详细解决方案

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

热度:99   发布时间:2023-09-29 05:05:45.0

一、什么是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">SELECTtto.ID,tto.`NAME`,tto.NUMBER,tu.ID AS UID,tu.`NAME` AS USERNAMEFROMt_t_order tto,t_user tuWHEREtu.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">SELECTtr.ID AS ORDER_ID,tr.`NAME`,tr.NUMBER,tod.ID AS DID,tod.ITEM_NUMBER,tod.`NAME` AS DNAME,tu.ID,tu.`NAME` AS USERNAMEFROMt_t_order tr,t_t_order_detail tod,t_user tuWHEREtod.ORDER_ID = tr.IDAND tu.ID = tr.CREATE_ID
</select>

 

  相关解决方案