一、模型分析
user和orders
user---->orders
一个用户可以创建多个订单,一对多。
orders--->user
一个订单只由一个用户创建,一对一。
orders和orderdetail
orders--->orderdetail
一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系。
orderdetail---> orders
一个订单明细只能包括在一个订单中,一对一。
orderdetail和items
orderdetail--->itesms
一个订单明细只对应一个商品信息,一对一。
items---> orderdetail
一个商品可以包括在多个订单明细 ,一对多。
二、一对一查询
1.使用resultType
复杂查询时,单表对应的po类已不能满足输出结果集的映射。所以要根据需求建立一个扩展类来作为resultType的类型。
User.java
public class User implements Serializable{ private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public User(){ } public User(String username,String sex,Date birthday,String address){ this.username = username; this.sex = sex; this.birthday = birthday; this.address = address; } //get、set..... }
Orders.java
public class Orders implements Serializable{ private Integer id; private Integer userId; private String number; private Date createtime; private String note; //get、set..... }
我们要执行如下语句:
(1)编写PO类
public class OrdersExt extends Orders{ private String username; private String sex; private String address; //get、set...... }
(2)编写mapper接口
public interface OrdersMapper{ public List<OrdersExt> findOrderAndUser(); }
(3)编写映射文件
Test.java
@Test public void testFindUsersByNameAndSex(){ SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class); List<OrdersExt> list = mapper.findOrderAndUser(); for(OrdersExt orderExt : list){ System.out.println(orderExt); } sqlSession.close(); }
2.使用resultMap
(1)修改PO类,添加User对象
(2)编写mapper接口
(3)编写映射文件
一对一查询
resultType: 使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果的特殊要求建议使用resultType。
resultMap: 需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的对象属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。
三、一对多映射
(1)需求
查询订单信息及订单明细和用户信息。
(2)Sql语句
确定主查询表: 订单表
确定关联查询表: 订单明细表、用户表
在一对一查询基础上添加订单明细关联表即可。
(3)修改PO类
(4)编写mapper接口
(5)编写mapper配置文件
collection: 定义一个一对多关系。
ofType: 指定该集合参数所映射的类型。
四、多对多
(1)需求
查询用户信息及用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中。
(2)Sql语句
查询主表: user
查询关联表: orders、orderdetail、items
(3)映射思路
将用户信息映射到user中。
在user类中添加订单列表属性List<Orders> orders,将用户创建的订单映射到orders。
在Orders中添加订单明细列表属性List<Orderdetail> detailList,将订单的明细映射到detailList。
在Orderdetail中添加Items属性,将订单明细所对应的商品映射到Items。
(4)修改PO类
(5)编写mapper接口
(6)编写mapper配置文件