mybatis3--7.resultMap高级映射

来源:互联网 发布:java gc日志 编辑:程序博客网 时间:2024/05/16 01:08

1      分析数据模型

1.1        思路

1、  明确每张表存储的信息

2、  明确每张表中关键字段(主键、外键、非空)

3、  明确数据库中表与表之间的外键关系

4、  明确业务中表与表的关系(建立在具体的业务)

 

1.2        图形分析

 

 


1.3        外键关系

 

user和orders:

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

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

 

orders和orderdetail:

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

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

 

 

orderdetail和itesm:

orderdetail---》itesms:一个订单明细只对应一个商品信息,一对一

items--> orderdetail:一个商品可以包括在多个订单明细,一对多

 

1.4        没有外键关系

Orders和items:

这两张表没有直接的外键关系,通过业务及数据库的间接关系分析出它们是多对多的关系

Ordersà orderdetail –>items:一个订单可以有多个订单明细,一个订单明细对应一个商品,所以一个订单对应多个商品

Items-àorderdetailàorders:一个商品可以对应多个订单明细,一个订单明细对应一个订单,所以一个商品对应多个订单

 

User和items:

这两张表没有直接的外键关系,通过业务及数据库的间接关系分析出它们是多对多的关系

Useràordersàorderdetailàitems:一个用户有多个订单,一个订单有多个订单明细、一个订单明细对应一个商品,所以一个用户对应多个商品

Itemsàorderdetailàordersàuser:一个商品对应多个订单明细,一个订单明细对应一个订单,一个订单对应一个用户,所以一个商品对应多个用户


 

2      一对一查询

2.1    需求

查询订单信息关联查询用户信息

 

2.2    sql语句

查询语句:

先确定主查询表:订单信息表

再确定关联查询表:用户信息

通过orders关联查询用户使用user_id一个外键,只能关联查询出一条用户记录就可以使用内连接

 

SELECT orders.*, user.username, user.sexFROM orders, USERWHERE orders.user_id = user.id

2.3    使用resultType实现

2.3.1    创建po类

基础的单表的 po类:

 

2.3.2    一对一查询映射的pojo

 

创建pojo包括订单信息和用户信息,resultType才可以完成映射。

 

创建OrderCustom作为自定义pojo,继承sql查询列多的po类。

  

 

2.3.3    mapper.xml

定义mapper.xml文件,

  

2.3.4    mapper.java

2.3.5    测试

2.4    使用resultMap实现一对一

2.4.1    resultMap映射思路

resultMap提供一对一关联查询的映射和一对多关联查询映射,一对一映射思路:将关联查询的信息映射到pojo中,如下:

 

在Orders类中创建一个User属性,将关联查询的信息映射到User属性中。

 

 

2.4.2    mapper.xml

 

 

2.4.3    resultMap定义

<!-- 一对一resultMap -->   <resultMap type="orders" id="ordersUserResultMap">      <!-- 完成订单信息配置 -->      <!-- 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:用于对关联信息映射到单个pojo         property:要将关联信息映射到orders的哪个属性中         javaType:关联信息映射到orders的属性的类型,是user的类型       -->      <association property="user" javaType="user">         <id column="user_id"property="id"/>         <result column="username" property="username"/>         <result column="sex" property="sex"/>      </association>   </resultMap>

2.4.4    mapper.java

 

2.4.5    测试

2.5    小结

resultType:要自定义pojo 保证sql查询列和pojo的属性对应,这种方法相对较简单,所以应用广泛。

 

resultMap:使用association完成一对一映射需要配置一个resultMap,过程有点复杂,如果要实现延迟加载就只能用resultMap实现 ,如果为了方便对关联信息进行解析,也可以用association将关联信息映射到pojo中方便解析。

3      一对多查询

 

3.1    需求

 

查询所有订单信息及订单下的订单明细信息。

 

3.2    sql语句

 

主查询表:订单表

关联查询表:订单明细

SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_idFROM orders, USER, orderdetailWHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id

3.3    pojo

 

resultMap 提供collection完成关联信息映射到集合对象中。

 

在orders类中创建集合属性:

 

 

3.4    mapper.xml

  

3.5    resultMap定义

  

3.6    mapper.java

  

3.7   小结

 

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

 

使用resultType实现:

需要对结果集进行二次处理。

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


4      一对多查询(复杂)

4.1    需求

查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息

 

4.2    sql

主查询表:用户信息

关联查询:订单、订单明细,商品信息

SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_id, items.name items_name, items.detail items_detailFROM orders, USER, orderdetail, itemsWHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id ANDitems.id = orderdetail.items_id


4.3    pojo定义

 

在user.java中创建映射的属性:集合 List<Orders>  orderlist

在Orders中创建映射的属性:集合List<Orderdetail> orderdetails

在Orderdetail中创建商品属性:pojo   Items items

  



4.4    mapper.xml


4.5    resultMap

 

 

4.6    mapper.java

 

 

5      多对多查询(自己实现 )

5.1    需求

一对多是多对多的特例。

 

需求1:

查询显示字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)

企业开发中常见明细列表,用户购买商品明细列表,

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

 

需求2:

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

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

示例二

 

5.2    Sql

SELECT user.id user_id, user.username user_name, orders.number orders_number, items.*FROM orders, USER, orderdetail, itemsWHERE orders.user_id = user.id  ANDorders.id = orderdetail.orders_id  ANDitems.id = orderdetail.items_id


5.3    Pojo定义

在user.java中创建映射的属性:集合 List<Orders>  orderlist

在Orders中创建映射的属性:集合List<Orderdetail> orderdetails

在Orderdetail中创建商品属性:pojo   Items items

 

5.4    Mapper.xml

<!-- 多对多 -->   <select id="findUserOrderItems" resultMap="UserOrderItemsResultMap">      SELECT        user.id user_id,        user.username user_name,        orders.number orders_number,        items.*      FROM        orders,        USER,        orderdetail,        items      WHEREorders.user_id = user.id        AND orders.id = orderdetail.orders_id        AND items.id = orderdetail.items_id   </select> 

5.5    reslutMap

<!-- 多对多 -->   <resultMap type="user" id="UserOrderItemsResultMap">      <!-- user -->      <id column="user_id"property="id"/>      <result column="username" property="username"/>           <!-- order -->      <collection property="orderlist" ofType="mybatis.po.Orders">         <id column="id"property="id"/>         <result column="number" property="number"/>                 <!-- Orderdetail -->         <collection property="orderdetails" ofType="mybatis.po.Orderdetail">                 <id column="orders_id"property="ordersId"/>                 <id column="items_Id"property="itemsId"/>                                 <!-- items -->                 <association property="items"javaType="mybatis.po.Items">                           <id column="id"property="id"/>                <result column="name" property="name"/>                <result column="price" property="price"/>                <result column="detail" property="detail"/>                <result column="pic" property="pic"/>                <result column="createtime" property="createtime"/>              </association>            </collection>              </collection>   </resultMap>

 

5.6    Mapper.java

@Test   public void findUserOrderItems() throws Exception{      SqlSessionsqlSession = sqlSessionFactory.openSession();           //创建mapper代理对象      OrdersMapperordersMapper = sqlSession.            getMapper(OrdersMapper.class);           //调用方法      List<User>list = ordersMapper.findUserOrderItems();           System.out.println(list);    }


 

5.7      小结

将查询用户购买的商品信息明细清单,(用户名、用户地址、购买商品名称、购买商品时间、购买商品数量)

 

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

 

一对多是多对多的特例,如下需求:

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

需求1:

查询字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)

企业开发中常见明细列表,用户购买商品明细列表,

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

 

需求2:

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

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

 

总结:

 

使用resultMap是针对那些对查询结果映射有特殊要求的功能,,比如特殊要求映射成list中包括 多个list。

 

6    高级映射总结

6.1        resultType:

作用:

         将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:

         常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

 

6.2        resultMap:

         使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。

 

6.3        association:

作用:

         将关联查询信息映射到一个pojo对象中。

场合:

         为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。

         使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

        

6.4        collection:

作用:

         将关联查询信息映射到一个list集合中。

场合:

         为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。

         如果使用resultType无法将查询结果映射到list集合中。


源代码文件:http://download.csdn.net/detail/qq_26553781/9763414

 

0 0
原创粉丝点击