天天看點

mybatis一對多關聯 建立_MyBatis多對多關聯查詢(級聯查詢)

其實,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 所示。

mybatis一對多關聯 建立_MyBatis多對多關聯查詢(級聯查詢)

圖 1  多對多級聯查詢結果