一、模型分析
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配置文件