myBatis关联关系映射

1、一对多和多对一

这里简单用订单案例来演示: 一个订单对应多个订单详情(一对多),一个订单详情对应一个订单(多对一);
在这里插入图片描述
修改generatorConfig.xml配置文件的生成目录(mapper和model)及对应生成关系
在这里插入图片描述

新建两个Vo类分别继承Order实体类,和orderItem 类,
order

package com.hyf.ssm.vo;

import com.hyf.ssm.model.Order;
import com.hyf.ssm.model.OrderItem;

import java.util.List;

public class OrderVo  extends Order {
    private List<OrderItem> orderItems;

    public List<OrderItem> getOrderItems() {
        return orderItems;
    }

    public void setOrderItems(List<OrderItem> orderItems) {
        this.orderItems = orderItems;
    }
}

orderItem

package com.hyf.ssm.vo;

import com.hyf.ssm.model.Order;
import com.hyf.ssm.model.OrderItem;

public class OrderItemVo extends OrderItem {
    private Order order;

    public Order getOrder() {
        return order;
    }

    public void setOrder(Order order) {
        this.order = order;
    }
}

一对多的配置
orderMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hyf.ssm.mapper.OrderMapper">
    <resultMap id="BaseResultMap" type="com.hyf.ssm.model.Order">
        <constructor>
            <idArg column="order_id" jdbcType="INTEGER" javaType="java.lang.Integer"/>
            <arg column="order_no" jdbcType="VARCHAR" javaType="java.lang.String"/>
        </constructor>
    </resultMap>

    <!-- 关联关系-->
    <!-- 一对多-->
    <resultMap id="orderVoMap" type="com.hyf.ssm.vo.OrderVo">
        <result property="orderId" column="order_id"></result>
        <result property="orderNo" column="order_no"></result>
        <collection property="orderItems" ofType="com.hyf.ssm.model.OrderItem">
            <result property="orderItemId" column="order_item_id"></result>
            <result property="productId" column="product_id"></result>
            <result property="quantity" column="quantity"></result>
            <result property="oid" column="oid"></result>
        </collection>
    </resultMap>

    <!--查询订单 -->
    <select id="queryOrderVoByOrderId" resultMap="orderVoMap" parameterType="java.lang.Integer">
    select * from t_hibernate_order o,t_hibernate_order_item oi
    where o.order_id = oi.oid
    and o.order_id = #{orderId}
    </select>

</mapper>

多对一的配置
orderItemMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hyf.ssm.mapper.OrderItemMapper" >
  <resultMap id="BaseResultMap" type="com.hyf.ssm.model.OrderItem" >
    <constructor >
      <idArg column="order_item_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="product_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="quantity" jdbcType="INTEGER" javaType="java.lang.Integer" />
      <arg column="oid" jdbcType="INTEGER" javaType="java.lang.Integer" />
    </constructor>
  </resultMap>


  <!-- 多对一-->
  <resultMap id="orderItemVoMap" type="com.hyf.ssm.vo.OrderItemVo">
    <result property="orderItemId" column="order_item_id"></result>
    <result property="productId" column="product_id"></result>
    <result property="quantity" column="quantity"></result>
    <result property="oid" column="oid"></result>
    <association property="order" javaType="com.hyf.ssm.model.Order">
      <result property="orderId" column="order_id"></result>
      <result property="orderNo" column="order_no"></result>
    </association>
  </resultMap>

  <select id="queryOrderItemVoByOrderItemId" resultMap="orderItemVoMap" parameterType="java.lang.Integer">
   select * from t_hibernate_order o,t_hibernate_order_item oi
    where o.order_id = oi.oid
    and oi.order_item_id = #{orderItemId}
</select>

</mapper>

orderMapper

 OrderVo queryOrderVoByOrderId(@Param("orderId") Integer orderId);

orderItemMappe

OrderItemVo queryOrderItemVoByOrderItemId(@Param("orderItemId") Integer orderItemId);

One2MaryService

package com.hyf.ssm.service;

import com.hyf.ssm.vo.OrderItemVo;
import com.hyf.ssm.vo.OrderVo;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2019-11-21 23:53
 */
public interface One2MaryService {
    OrderVo queryOrderVoByOrderId(Integer orderId);
    OrderItemVo queryOrderItemVoByOrderItemId(Integer OrderItemId);
}

One2MaryServiceImpl

package com.hyf.ssm.service.impl;

import com.hyf.ssm.mapper.OrderItemMapper;
import com.hyf.ssm.mapper.OrderMapper;
import com.hyf.ssm.service.One2MaryService;
import com.hyf.ssm.vo.OrderItemVo;
import com.hyf.ssm.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2019-11-22 0:21
 */
@Service
public class One2MaryServiceImpl implements One2MaryService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private OrderItemMapper orderItemMapper;
    @Override
    public OrderVo queryOrderVoByOrderId(Integer orderId) {
        return orderMapper.queryOrderVoByOrderId(orderId);
    }

    @Override
    public OrderItemVo queryOrderItemVoByOrderItemId(Integer OrderItemId) {
        return orderItemMapper.queryOrderItemVoByOrderItemId(OrderItemId);
    }
}

One2MaryServiceImplTest

package com.hyf.ssm.service.impl;

import com.hyf.ssm.mapper.OrderItemMapper;
import com.hyf.ssm.mapper.OrderMapper;
import com.hyf.ssm.service.One2MaryService;
import com.hyf.ssm.vo.OrderItemVo;
import com.hyf.ssm.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2019-11-22 0:21
 */
@Service
public class One2MaryServiceImpl implements One2MaryService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private OrderItemMapper orderItemMapper;
   
    // 一对多
    @Override
    public OrderVo queryOrderVoByOrderId(Integer orderId) {
        return orderMapper.queryOrderVoByOrderId(orderId);
    }
   // 多对一
    @Override
    public OrderItemVo queryOrderItemVoByOrderItemId(Integer OrderItemId) {
        return orderItemMapper.queryOrderItemVoByOrderItemId(OrderItemId);
    }
}

打印:
一对多,一个订单有多个订单详
在这里插入图片描述
多对一
在这里插入图片描述

2、多对多

书籍案例来演示:
在这里插入图片描述

首先先用逆向生成工具生成t_hibernate_book、t_hibernate_book_category、t_hibernate_category,这两张表对应的model与mapper
在这里插入图片描述

实体类Vo 处理结果集
HBookVo

package com.hyf.ssm.vo;

import com.hyf.ssm.model.HBook;
import com.hyf.ssm.model.HCategory;

import java.util.List;

public class HBookVo extends HBook {
    private List<HCategory> categories;

    public List<HCategory> getCategories() {
        return categories;
    }
    public void setCategories(List<HCategory> categories) {
        this.categories = categories;
    }
}

HCategoryVo

package com.hyf.ssm.vo;

import com.hyf.ssm.model.HBook;
import com.hyf.ssm.model.HCategory;

import java.util.List;

public class HCategoryVo extends HCategory {

    private List<HBook>  hBooks;

    public List<HBook> gethBooks() {
        return hBooks;
    }

    public void sethBooks(List<HBook> hBooks) {
        this.hBooks = hBooks;
    }
}

在它们的中间表添加多对多映射关系
HbookCategoryMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.hyf.ssm.mapper.HbookCategoryMapper">
    <resultMap id="BaseResultMap" type="com.hyf.ssm.model.HbookCategory">
        <constructor>
            <idArg column="bcid" jdbcType="INTEGER" javaType="java.lang.Integer"/>
            <arg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer"/>
            <arg column="cid" jdbcType="INTEGER" javaType="java.lang.Integer"/>
        </constructor>
    </resultMap>

    <!--多对多 -->
    <resultMap id="HBookVoMap" type="com.hyf.ssm.vo.HBookVo">
        <result property="bookId" column="book_id"></result>
        <result property="bookName" column="book_name"></result>
        <result property="price" column="price"></result>
        <collection property="categories" ofType="com.hyf.ssm.model.HCategory">
            <result property="categoryId" column="category_id"></result>
            <result property="categoryName" column="category_name"></result>
        </collection>
    </resultMap>

    <resultMap id="HCategoryVoMap" type="com.hyf.ssm.vo.HCategoryVo">
        <result property="categoryId" column="category_id"></result>
        <result property="categoryName" column="category_name"></result>
        <collection property="hBooks" ofType="com.hyf.ssm.model.HBook">
            <result property="bookId" column="book_id"></result>
            <result property="bookName" column="book_name"></result>
            <result property="price" column="price"></result>
        </collection>
    </resultMap>
     
     <!-- 通过书籍Id 查询相对应的书籍类型 -->
    <select id="queryBookId" parameterType="java.lang.Integer" resultMap="HBookVoMap">
   select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c
    where b.book_id = bc.bid and bc.cid = c.category_id and b.book_id =#{bookId}
  </select>

     <!-- 通过书籍类型查询相对应的书籍Id -->
    <select id="queryByCid" resultMap="HCategoryVoMap" parameterType="java.lang.Integer">
    select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c
     where b.book_id = bc.bid and bc.cid = c.category_id and c.category_id=#{cid}
   </select>

</mapper>

HbookCategoryMapper.java

package com.hyf.ssm.mapper;

import com.hyf.ssm.model.HbookCategory;
import com.hyf.ssm.vo.HBookVo;
import com.hyf.ssm.vo.HCategoryVo;
import org.apache.ibatis.annotations.Param;

public interface HbookCategoryMapper {
  
    HBookVo queryBookId(@Param("bookId") Integer bookid);

    HCategoryVo queryByCid(@Param("cid") Integer cid);
}

Many2ManyService

package com.hyf.ssm.service;

import com.hyf.ssm.vo.HBookVo;
import com.hyf.ssm.vo.HCategoryVo;

public interface Many2ManyService {
    HBookVo queryBookId(Integer bookid);

    HCategoryVo queryByCid(Integer cid);
}

Many2ManyServiceImpl

package com.hyf.ssm.service.impl;

import com.hyf.ssm.mapper.HbookCategoryMapper;
import com.hyf.ssm.service.Many2ManyService;
import com.hyf.ssm.vo.HBookVo;
import com.hyf.ssm.vo.HCategoryVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class Many2ManyServiceImpl implements Many2ManyService {
    @Autowired
    private HbookCategoryMapper hbookCategoryMapper;

    @Override
    public HBookVo queryBookId(Integer bookid) {
        return hbookCategoryMapper.queryBookId(bookid);
    }

    @Override
    public HCategoryVo queryByCid(Integer cid) {
        return hbookCategoryMapper.queryByCid(cid);
    }
}

测试类:

package com.hyf.ssm.service.impl;

import com.hyf.ssm.SpringBaseTest;
import com.hyf.ssm.model.HBook;
import com.hyf.ssm.model.HCategory;
import com.hyf.ssm.service.Many2ManyService;
import com.hyf.ssm.vo.HBookVo;
import com.hyf.ssm.vo.HCategoryVo;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author xhy
 * @site www.4399.com
 * @company xxx公司
 * @create 2019-11-22 11:54
 */
public class Many2ManyServiceImplTest extends SpringBaseTest {
@Autowired
   private Many2ManyService many2ManyService;


    @Test
    // 通过书籍名称来获取类型
    public void queryBookId() {
        HBookVo hBookVo = many2ManyService.queryBookId(8);
        System.out.println(hBookVo);
        for (HCategory category : hBookVo.getCategories()) {
            System.out.println(category);
        }

    }

    @Test
    // 通过类型籍名称来获取书籍名
    public void queryByCid() {
        HCategoryVo hCategoryVo = many2ManyService.queryByCid(8);
        System.out.println(hCategoryVo);
        for (HBook gethBook : hCategoryVo.gethBooks()) {
            System.out.println(gethBook);
        }

    }
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值