其实,MyBatis 没有实现多对多级联,这是因为多对多级联可以通过两个一对多级联进行替换。

例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系,使用一个中间表(订单记录表)就可以将多对多级联转换成两个一对多的关系。

下面以订单和商品(实现“查询所有订单以及每个订单对应的商品信息”的功能)为例讲解多对多级联查询。

1)创建数据表

订单表在前面已创建,这里需要创建商品表 product 和订单记录表 orders_detail,创建代码如下:

  1. CREATE TABLE ‘product’(
  2. ‘id’ tinyint(2) NOT NULL,
  3. ‘name’ varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  4. ‘price’ double DEFAULT NULL,
  5. PRIMARY KEY (‘id’)
  6. );
  7. CREATE TABLE ‘orders_detail’(
  8. ‘id’ tinyint(2) NOT NULL AUTO_INCREMENT,
  9. ‘orders_id’ tinyint(2) DEFAULT NULL,
  10. ‘product_id’ tinyint(2) DEFAULT NULL,
  11. PRIMARY KEY (‘id’),
  12. KEY ‘orders_id’ (‘orders_id’),
  13. KEY ‘product_id’ (‘product_id’),
  14. CONSTRAINT ‘orders_id’ FOREIGN KEY (‘orders_id’) REFERENCES ‘orders’ (‘id’),
  15. CONSTRAINT ‘product_id’ FOREIGN KEY (‘product_id’) REFERENCES ‘product’ (‘id’)
  16. );

    2)创建持久化类

    在 myBatisDemo02 应用的 com.po 包中创建数据表 product 对应的持久化类 Product,而中间表 orders_detail 不需要持久化类,但需要在订单表 orders 对应的持久化类 Orders 中添加关联属性。

Product 的代码如下:

  1. package com.po;

  2. import java.util.List;

  3. public class Product {
  4. private Integer id;
  5. private String name;
  6. private Double price;
  7. // 多对多中的一个一对多
  8. private List orders;

  9. // 省略setter和getter方法
  10. @Override
  11. public String toString() { // 为了方便查看结果,重写了toString方法
  12. return “Product[id=” + id + “,name=” + name + “,price=” + price + “]”;
  13. }
  14. }

Orders 的代码如下:

  1. package com.po;
  2. import java.util.List;
  3. public class Orders {
  4. private Integer id;
  5. private String ordersn;
  6. // 多对多中的另一个一对多
  7. private List products;

  8. // 省略setter和getter方法
  9. @Override
  10. public String toString() {
  11. return “Orders[id=” + id + “,ordersn=” + ordersn + “,products=”
    • products + “]”;
  12. }
  13. }

    3)创建映射文件

    本实例只需在 com.mybatis 的 OrdersMapper.xml 文件中追加以下配置即可实现多对多级联查询。

    4)创建 POJO 类

    该实例不需要创建 POJO 类。

    5)添加数据操作接口方法

    在 Orders 接口中添加以下接口方法:
    public List selectallOrdersAndProducts();

    6)调用接口方法及测试

    在 myBatisDemo02 应用的 com.controller 包中创建 MoreToMoreController 类,在该类中调用第 5 步的接口方法,同时创建测试类 TestMoreToMore。

MoreToMoreController 的代码如下:

  1. package com.controller;

  2. import java.util.List;

  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;

  5. import com.dao.OrdersDao;
  6. import com.po.Orders;

  7. @Controller(“moreToMoreController”)
  8. public class MoreToMoreController {
  9. @Autowired
  10. private OrdersDao ordersDao;

  11. public void test() {
  12. List os = ordersDao.selectallOrdersAndProducts();
  13. for (Orders orders : os) {
  14. System.out.println(orders);
  15. }
  16. }
  17. }

TestMoreToMore 的代码如下:

  1. package com.controller;

  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;

  4. public class TestMoreToMore {
  5. public static void main(String[] args) {
  6. ApplicationContext appcon = new ClassPathXmlApplicationContext(
  7. “applicationContext.xml”);
  8. MoreToMoreController otm = (MoreToMoreController) appcon
  9. .getBean(“moreToMoreController”);
  10. otm.test();
  11. }
  12. }

上述测试类的运行结果如图 1 所示。

29-MyBatis多对多关联查询(级联查询) - 图1
图 1 多对多级联查询结果