13-一对多左连接查询分步查询(查询所有客户及客户对应的订单)
查詢所有客戶以及對應(yīng)的訂單
目錄
- 左連接查詢(不支持懶加載)
- 分步查詢(支持懶加載)
?
左連接查詢(不支持懶加載)
場景:我們想要查詢出所有的客戶,并且把每個(gè)客戶對應(yīng)的訂單也查出來。這時(shí)候可以使用左連接查詢。
那么如何在 MyBatis 中實(shí)現(xiàn)左連接查詢呢?
給客戶的 domain 增添一個(gè)字段來表示對應(yīng)的訂單: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<>(); // 對應(yīng)的訂單 }在 CustomerMapper 接口類中添加方法:
/*查詢客戶和訂單*/ public List<Customer> getAllCustomer();在 CustomerMapper 映射文件中寫 SQL:由于查詢結(jié)果既包含客戶又包含訂單,我們需要用 resultMap 來自定義結(jié)果集。
與之前查詢訂單(多)附帶客戶(一)的 association 相對于,這里查詢客戶(一)附帶訂單(多)需要 collection 標(biāo)簽。
代碼如下:
<!--自定義結(jié)果集--> <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"> /*使用自定義的結(jié)果集*/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(); }運(yùn)行結(jié)果:成功查詢出所有的客戶與他們對應(yīng)的訂單。
分步查詢(支持懶加載)
分步查詢也可以達(dá)到我們的要求,先查出所有客戶的信息,再根據(jù)查出的客戶的 cust_id 去查訂單。
OrderMapper 接口中定義根據(jù) cust_id 查詢訂單的方法:
OrderMapper 映射文件中寫 SQL:
定義好接口中的方法后,CustomerMapper 映射文件中寫 SQL,利用 collection 實(shí)現(xiàn)分步查詢(與之前的 association 類似)。
測試類中:
運(yùn)行結(jié)果:每個(gè)查詢出來的用戶,都會(huì)再根據(jù)他的 cust_id 去查詢訂單。但是由圖可見,會(huì)產(chǎn)生很多的 sql 語句。(左連接只需要一句SQL)
總結(jié)
以上是生活随笔為你收集整理的13-一对多左连接查询分步查询(查询所有客户及客户对应的订单)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12-多对一添加操作(添加新客户及对应的
- 下一篇: 14-多对多关系建表