MyBatis学习四:高级映射

来源:互联网 发布:学校网络结构拓扑图 编辑:程序博客网 时间:2024/06/05 11:15

一、数据模型分析思路:

1、每张表记录的数据内容

         分模块对每张表记录的内容进行熟悉,相当于你学习系统需求(功能)的过程。

用户表user:记录了购买商品的用户信息

订单表orders:记录了用户所创建的订单(即购买商品的订单)

订单明细表orderdetails:记录了订单的详细信息即购买商品的信息

商品表items:记录了商品的详细信息

2、每张表重要的字段设置

         非空字段、外键字段

3、数据库级别表与表之间的关系

         外键关系

4、表与表之间的业务关系

在分析表与表之间的业务关系时一定要建立在某个业务意义基础上去分析。

1)  先分析数据库级别之间有关系的表之间的业务关系:

A)user和orders:

user->orders:一个用户可创建多个订单,一对多;

orders->user 一个订单只由一个用户创建,一对一;

B)orders和orderdetail:

orders->orderdetail:一个订单可包括多个订单明细,因为一个订单可购买多个商品,每个商品的购买信息在orderdetail记录中,一对多;

orderdetail->orders:一个订单只能明细只能包括在一个订单中,一对一;

C)orderdetail和items:

orderdetail->items:一个订单明细只对应一个商品,一对一;

items->orderdetail:一个商品可包括在多个订单中,一对多;

 2)再分析数据库级别没有关系的表之间是否有业务关系:

  A)orders和items

二、一对一查询

2.1 需求:

查询订单信息,关联查询创建订单的用户信息

2.2 sql语句怎么写

         确定查询的主表:订单表

         确定查询的关联表:用户表

         关联查询使用内连接,还是外连接?

         由于orders表中有一个外键(user_id),通过外键关联查询用户表只能查询出一条记录,可使用内连接。

SELECT

         orders.*,

         USER.username,

         USER.sex,

         USER.address

FROM

         orders,

         USER

WHERE orders.user_id=user.id

2.3两种查询方法
2.3.1resultType实现思路

1)将上边的查询结果映射到pojo中,pojo中必须包括所有查询列名。

2)原始的Orders.java不能映射所有字段,需要创建新的pojo。创建一个pojo继承包括查询字段较多的po类。

2.3.2resultMap实现思路

         使用resultMap将查询结果中的订单信息映射到Orders对象中,在Orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。

public class Orders{

         privateInteger id;

         privateInteger userId;

         privateString number;

         privateString createTime;

         privateUser user;

}

订单查询关联用户的resultMap,将整个查询的结果映射到cn.itcast.mybatis.po.Orders中,将整个查询的结果映射到cn.itcast.mybatis.po.Orders中。

<resultMap type="cn.itcast.mybatis.po.Orders" id="OrderUserResultMap"><!-- 配置映射的订单信息 --><!-- id:指定查询中的唯一标识,订单信息中的唯一标识;如果有多个列组成唯一标识,配置多个id --><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" /><!-- 配置映射的关联用户信息 --><!-- association:用于映射关联查询单个对象的信息 property:要将关联查询的用户信息映射到Orders中哪个属性 --><association property="user" javaType="cn.itcast.mybatis.po.User"><!-- id:关联查询用户的唯一标识 column:指定唯一标识用户信息的列 javaType:映射到user的哪个属性 --><id column="user_id" property="id" /><result column="username" property="username" /><result column="sex" property="sex" /><result column="address" property="address" /></association></resultMap>

2.4、一对一查询总结

         resultType:实现比较简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。

         resultMap:需要单独定义resultMap,如果有对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射到pojo的属性中。

         resultType中不能通过对象映射,只能将对象的属性全都定义到pojo中;resultMap可将对象直接定义到po中,然后通过映射实现。

         resultMap可实现延迟加载,resultType不能。

三、一对多查询

3.1需求:查询订单及订单明细信息。
3.2 sql语句:

确定主查询表:订单表

确定关联查询表:订单明细表

在一对一基础上添加订单明细表关联即可。

如果直接使用resultType将上边的查询结果映射到pojo中,订单信息就会重复。要求:对orders映射不能出现重复记录。在orders.java类中添加List<orderDetail> orderDetails属性,最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。

3.3实现思路
3.3.1 resultMap

         mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

订单及订单明细的resultMap,使用extends继承,不用在配置订单信息和用户信息的映射。

<resultMap type=”cn.itcast.mybatis.po.Orders” id=”OrdersAndOrderDetailResultMap” extends=”OrderUserResultMap”><!—订单信息 --><!—用户信息 --><!— 使用继承不用再配置订单信息和用户信息的映射 --><!—订单明细信息 一个订单关联查出了多条明细,要使用collection进行映射collection:对关联查询到多条记录映射到集合对象中property:将关联查询到多条记录映射到cn.itcast.mybatis.po.Orders哪个属性ofType:指定映射到list集合属性中pojo的类型--><collection property=”orderdetails” ofType=”cn.itcast.mybatis.po.Orderdetail”><id column=”orderdetail_id” property=”id”/><result column=”items_id” property=”itemsId”/></collection></resultMap>

3.3.2使用resultType实现:

         将订单明细映射到orders中的orderdetails中,需要自己关联,使用双重循环遍历,去掉重复记录,将订单明细放到orderdetails中。

四、多对多查询

4.1需求:查询用户及用户所购买的商品信息

分析:

查询主表:用户表

关联表:由于用户和商品没有直接关联,通过订单和订单明细关联,所有关联表:orders、orderdetail、items

4.2 sql语句
4.3映射思路

要将用户信息映射到user中,需要:

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

在Orders中添加订单明细属性List<OrderDetail> ordersDetail,将订单的明细映射到orderdetails;

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

代码中注意嵌套关系即可:

<!—查询用户及购买的商品 --><resultMap ……><-- 用户信息 --><collection>……<-- 订单信息,一个用户对应多个订单,使用collection映射 --><collection>……<-- 订单明细,一个订单对应多个订单明细 --><collection>……<-- 商品信息,一个订单明细对应一个商品 --><association>……</association></collection></collection><collection></resultMap>

4.4多对多查询总结

         1)情形一:查询用户购买的商品信息明细清单(用户名、用户地址、购买商品名称、购买商品时间、购买商品数量)

         针对上边的需求就使用resultType将查询到的记录映射到一个扩展的pojo中,很简单实现明细清单的功能。

         2)情形二:一对多查询是多对多查询的特例,如下需求:

查询用户购买的商品信息,用户与商品的关系是多对多关系。

需求1:

查询用户购买商品明细;

查询字段:用户账号、用户名称、用户性别、商品名称、商品价格

使用resultType将上边查询列映射到pojo输出。

需求2:

查询字段:用户账号、用户名称、购买商品数量、商品明细(鼠标移上去显示明细)

使用resultMap将用户购买的商品明细列表映射到user对象中。

3)总结

使用resultMap是针对那些对查询结果有特殊要求的功能,比如特殊要求映射成list中包括多个list;使用resultType无法将查询结果映射到pojo对象的pojo属性中。到底是用resultType还是resultMap,是根据对结果集查询遍历的需要选择。


0 0