数据模型分析
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 集合中。