13-一对多左连接查询分步查询(查询所有客户及客户对应的订单)
查詢所有客戶以及對應的訂單
目錄
- 左連接查詢(不支持懶加載)
- 分步查詢(支持懶加載)
?
左連接查詢(不支持懶加載)
場景:我們想要查詢出所有的客戶,并且把每個客戶對應的訂單也查出來。這時候可以使用左連接查詢。
那么如何在 MyBatis 中實現左連接查詢呢?
給客戶的 domain 增添一個字段來表示對應的訂單:private List<Order> orders = new ArrayList<>();
@Setter @Getter //使用注解生成 get 與 set 方法 @ToString public class Customer {private Integer cust_id;private String cust_name;private String cust_profession;private String cust_phone;private String email;private List<Order> orders = new ArrayList<>(); // 對應的訂單 }在 CustomerMapper 接口類中添加方法:
/*查詢客戶和訂單*/ public List<Customer> getAllCustomer();在 CustomerMapper 映射文件中寫 SQL:由于查詢結果既包含客戶又包含訂單,我們需要用 resultMap 來自定義結果集。
與之前查詢訂單(多)附帶客戶(一)的 association 相對于,這里查詢客戶(一)附帶訂單(多)需要 collection 標簽。
代碼如下:
<!--自定義結果集--> <resultMap id="custMap" type="customer"><id column="cust_id" property="cust_id"/><result column="cust_name" property="cust_name"/><result column="cust_phone" property="cust_phone"/><result column="cust_profession" property="cust_profession"/><result column="email" property="email"/><collection property="orders" ofType="Order"><id column="order_id" property="order_id"/><result column="order_name" property="order_name"/><result column="order_num" property="order_num"/></collection> </resultMap><!--查詢所有客戶和訂單--> <select id="getAllCustomer" resultMap="custMap"> /*使用自定義的結果集*/SELECT * FROM `customer` AS c LEFT JOIN `order` AS o ON c.cust_id = o.cust_id; </select>測試類中:
public void test4(){SqlSession sqlSession = MybatisUtils.openSession();CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);List<Customer> allCustomer = customerMapper.getAllCustomer();for (Customer customer : allCustomer) {System.out.println(customer);}sqlSession.close(); }運行結果:成功查詢出所有的客戶與他們對應的訂單。
分步查詢(支持懶加載)
分步查詢也可以達到我們的要求,先查出所有客戶的信息,再根據查出的客戶的 cust_id 去查訂單。
OrderMapper 接口中定義根據 cust_id 查詢訂單的方法:
OrderMapper 映射文件中寫 SQL:
定義好接口中的方法后,CustomerMapper 映射文件中寫 SQL,利用 collection 實現分步查詢(與之前的 association 類似)。
測試類中:
運行結果:每個查詢出來的用戶,都會再根據他的 cust_id 去查詢訂單。但是由圖可見,會產生很多的 sql 語句。(左連接只需要一句SQL)
總結
以上是生活随笔為你收集整理的13-一对多左连接查询分步查询(查询所有客户及客户对应的订单)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12-多对一添加操作(添加新客户及对应的
- 下一篇: 电脑文件夹加密的三种方法电脑上如何加密文