Mybatis 学习笔记之 高级映射(六)

数据模型分析

1.useryee 和 orders:

订单表:orders

记录了用户创建的订单,订单号(主键),创建用户:user_id(外键),创建时间,订单状态……

useryee ——> orders:一个用户可以创建多个订单,一对多;
orders ——> user:一个订单只由一个用户创建,一对一。

 

2.orders 和 orderdetail:

订单明细表:orderdetail (订单和商品的关联表)

记录了用户购买信息,所属订单:orders_id(外键),商品 id : items_id(外键),商品数量……

orders ——> orderdetail:一个订单可以包括 多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail 记录,一对多关系;
orderdetail ——> orders:一个订单明细只能包括在一个订单中,一对一。

 

3.orderdetail 和 products:

orderdetail ——> products:一个订单明细只对应一个商品信息,一对一
products ——> orderdetail:  一个商品可以包括在多个订单明细 ,一对多

 

4.数据库级别没有关系的表

再分析数据库级别没有直接关系的表之间是否有业务关系:
orders 和 products 之间可以通过 orderdetail 表建立 关系: orders 和 orderdetail 为一对多,products 和 orderdetail 为 一对多,则 orders ——> products 为 一对多;同理: products ——> orders 为 一对多,综合 orders 和 products 的关系为 多对多。

user 和 products 是多对多关系。

 

 

5.各个数据表数据

 

一对一查询

1.Orders 类中添加 User 属性:

 

2.userMapper.xml:

 

3.UserMapper.java:

 

4.UserMapperTest.java:

 

5.测试结果:

[Orders [id=1, userId=1, number=1000010, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=1, name=Lawxf, sex=male, address=null]], Orders [id=2, userId=1, number=1000011, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=1, name=Lawxf, sex=male, address=null]], Orders [id=3, userId=2, number=1000012, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=2, name=Yellia, sex=femal, address=null]]]

 

 

一对多查询

1. Orders 添加 orderDetail 属性:

 

2. userMapper.xml:

 

3.UserMapper.java:

 

4. UserMapperTest.java:

 

5.测试结果:

[Orders [id=2, userId=1, number=1000011, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=1, name=Lawxf, sex=male, address=null], orderDetails=[OrderDetail [id=3, ordersId=2, productsId=3, productsNum=4], OrderDetail [id=4, ordersId=2, productsId=2, productsNum=3]]], Orders [id=3, userId=2, number=1000012, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=2, name=Yellia, sex=femal, address=null], orderDetails=[OrderDetail [id=1, ordersId=3, productsId=1, productsNum=1], OrderDetail [id=2, ordersId=3, productsId=2, productsNum=3]]]]

 

 

多对多查询

1.需求

查询用户及用户购买产品信息。

2. sql 语句

查询主表是: user 表;

关联表:由于用户和产品没有直接关联,是通过订单和订单明细进行关联,所以关联表是:orders、orderdetail、products。

SELECT 
  orders.*,
  useryee.name,
  useryee.sex,
  useryee.address,
  orderdetail.id orderdetail_id,
  orderdetail.products_id,
  orderdetail.products_num,
  orderdetail.orders_id,
  products.name products_name,
  products.price  products_price,
  products.detail products_detail
FROM
  orders,
  useryee,
  orderdetail,
  products
WHERE orders.user_id = useryee.id AND orderdetail.orders_id=orders.id AND orderdetail.products_id=products.id

数据库查询结果:

 

 

3.映射思路

  • 将用户信息映射到 user 中。
  • 在 user 类中添加订单列表属性 List<Orders> orderslist,将用户创建的订单映射到 orderslist;
  • 在 Orders 中添加订单明细列表属性 List<OrderDetail>orderdetails ,将订单的明细映射到 orderdetails;
  • 在 OrderDetail 中添加 products 属性,将订单明细所对应的产品映射到 products;

 

4.userMapper.xml:

 

 

5. pojo 类:

 

6.UserMapper.java:

 

7. UserMapperTest.java: (测试类)

 

8.测试结果:

跟数据库查询结果一样。

[
User [id=2, name=Yellia, sex=femal, address=null, 
orderslist=[Orders [id=3, userId=null, number=1000012, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, 
orderDetails=[OrderDetail [id=1, ordersId=null, productsId=null, productsNum=1,
products=Products [id=1, name=iphone, detail=stupid果蛆, pic=null, price=10000.0, createTime=null]],
OrderDetail [id=2, ordersId=null, productsId=null, productsNum=3,
products=Products [id=2, name=Lennov, detail=PC not bad, pic=null, price=6000.0, createTime=null]]], user=null]]], 

User [id=1, name=Lawxf, sex=male, address=null, 
orderslist=[Orders [id=2, userId=null, number=1000011, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, 
orderDetails=[OrderDetail [id=3, ordersId=null, productsId=null, productsNum=4, 
products=Products [id=3, name=bitcoin, detail=amazing!, pic=null, price=88888.0, createTime=null]],
OrderDetail [id=4, ordersId=null, productsId=null, productsNum=3,
products=Products [id=2, name=Lennov, detail=PC not bad, pic=null, price=6000.0, createTime=null]]], user=null]]]
]

 

总结:

 

 

1. resultType:

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

2. resultMap:

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

2.1 association:

作用:
将关联查询信息映射到一个 pojo 对象中。
场合:
为了方便查询关联信息可以使用 association 将关联订单信息映射为用户对象的 pojo 属性中,比如:查询订单及关联用户信息。
使用 resultType 无法将查询结果映射到 pojo 对象的 pojo 属性中,根据对结果集查询遍历的需要选择使用 resultType 还是resultMap。
 

2.2 collection:

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

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值