其實,MyBatis 沒有實作多對多級聯,這是因為多對多級聯可以通過兩個一對多級聯進行替換。
例如,一個訂單可以有多種商品,一種商品可以對應多個訂單,訂單與商品就是多對多的級聯關系,使用一個中間表(訂單記錄表)就可以将多對多級聯轉換成兩個一對多的關系。
下面以訂單和商品(實作“查詢所有訂單以及每個訂單對應的商品資訊”的功能)為例講解多對多級聯查詢。
1)建立資料表
訂單表在前面已建立,這裡需要建立商品表 product 和訂單記錄表 orders_detail,建立代碼如下:
CREATE TABLE 'product'(
'id' tinyint(2) NOT NULL,
'name' varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
'price' double DEFAULT NULL,
PRIMARY KEY ('id')
);
CREATE TABLE 'orders_detail'(
'id' tinyint(2) NOT NULL AUTO_INCREMENT,
'orders_id' tinyint(2) DEFAULT NULL,
'product_id' tinyint(2) DEFAULT NULL,
PRIMARY KEY ('id'),
KEY 'orders_id' ('orders_id'),
KEY 'product_id' ('product_id'),
CONSTRAINT 'orders_id' FOREIGN KEY ('orders_id') REFERENCES 'orders' ('id'),
CONSTRAINT 'product_id' FOREIGN KEY ('product_id') REFERENCES 'product' ('id')
);
2)建立持久化類
在 myBatisDemo02 應用的 com.po 包中建立資料表 product 對應的持久化類 Product,而中間表 orders_detail 不需要持久化類,但需要在訂單表 orders 對應的持久化類 Orders 中添加關聯屬性。
Product 的代碼如下:
package com.po;
import java.util.List;
public class Product {
private Integer id;
private String name;
private Double price;
// 多對多中的一個一對多
private List orders;
// 省略setter和getter方法
@Override
public String toString() { // 為了友善檢視結果,重寫了toString方法
return "Product[id=" + id + ",name=" + name + ",price=" + price + "]";
}
}
Orders 的代碼如下:
package com.po;
import java.util.List;
public class Orders {
private Integer id;
private String ordersn;
// 多對多中的另一個一對多
private List products;
// 省略setter和getter方法
@Override
public String toString() {
return "Orders[id=" + id + ",ordersn=" + ordersn + ",products="
+ products + "]";
}
}
3)建立映射檔案
本執行個體隻需在 com.mybatis 的 OrdersMapper.xml 檔案中追加以下配置即可實作多對多級聯查詢。
4)建立 POJO 類
該執行個體不需要建立 POJO 類。
5)添加資料操作接口方法
在 Orders 接口中添加以下接口方法:
public List selectallOrdersAndProducts();
6)調用接口方法及測試
在 myBatisDemo02 應用的 com.controller 包中建立 MoreToMoreController 類,在該類中調用第 5 步的接口方法,同時建立測試類 TestMoreToMore。
MoreToMoreController 的代碼如下:
package com.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.dao.OrdersDao;
import com.po.Orders;
@Controller("moreToMoreController")
public class MoreToMoreController {
@Autowired
private OrdersDao ordersDao;
public void test() {
List os = ordersDao.selectallOrdersAndProducts();
for (Orders orders : os) {
System.out.println(orders);
}
}
}
TestMoreToMore 的代碼如下:
package com.controller;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMoreToMore {
public static void main(String[] args) {
ApplicationContext appcon = new ClassPathXmlApplicationContext(
"applicationContext.xml");
MoreToMoreController otm = (MoreToMoreController) appcon
.getBean("moreToMoreController");
otm.test();
}
}
上述測試類的運作結果如圖 1 所示。
圖 1 多對多級聯查詢結果