一、什么是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>