Mybatis的关联关系映射

文章目录


与hibernate一样,Mybatis也是分为一对多和多对多,下面按这两个来讲:

一对多

先用逆向生成工具生成两张表,我这里用的是t_hibernate_order、t_hibernate_order_item,也就是订单表和订单项表,他们的关系是一个order可以有多个orderitem。
需要注意的是你生成之前需要查看你的生成命令是否是在你这个项目中的:
在这里插入图片描述
在这里插入图片描述
为了防止破坏原有的类中的封装性和达到解耦的效果,我使用Vo来实现。

orderVo:

package com.zlk.model.vo;

import com.zlk.model.Order;
import com.zlk.model.OrderItem;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 大宝
 * @company 太厉害公司
 * @create  2019-09-26 11:40
 */
public class OrderVo extends Order {
    private List<OrderItem> orderItems = new ArrayList<>();

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

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

orderItemVo:

package com.zlk.model.vo;

import com.zlk.model.Order;
import com.zlk.model.OrderItem;

/**
 * @author 大宝
 * @company 太厉害公司
 * @create  2019-09-26 11:43
 */
public class OrderItemVo extends OrderItem {
    private Order order;

    public Order getOrder() {
        return order;
    }

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

然后在双方的接口中写一个查询方法,并且Mapper.xml中配置resultMap和Sql语句。

orderMapper.java:

OrderVo selectByOid(@Param("oid") Integer oid);

orderMapper.xml :
property指的是类属性,column指的是表字段,javaType表示关联属性类型。

  <resultMap id="OrderVoMap" type="com.zlk.model.vo.OrderVo" >
    <result property="orderId" column="order_id"></result>
    <result property="orderNo" column="order_no"></result>
    <collection property="orderItems" ofType="com.zlk.model.OrderItem">
      <result property="orderItemId" column="orderItem_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="selectByOid" 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 = #{oid}
  </select>

orderItemMapper.java:

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

orderItemMapper.xml:

  <resultMap id="OrderItemVoMap" type="com.zlk.model.vo.OrderItemVo" >
    <result property="orderItemId" column="orderItem_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.zlk.model.Order">
      <result property="orderId" column="order_id"></result>
      <result property="orderNo" column="order_no"></result>
    </association>
  </resultMap>


 <select id="selectByOrderItemId" 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>

配置好后即可测试一下:

    @Test
    public void selectByOid() {
        OrderVo orderVo = oneToManyServiceServIce.selectByOid(1);
        System.out.println(orderVo);
        for (OrderItem item : orderVo.getOrderItems()) {
            System.out.println(item);
        }
    }
    @Test
    public void selectByOrderItemId() {
        OrderItemVo o = oneToManyServiceServIce.selectByOrderItemId(1);
        System.out.println(o);
        System.out.println(o.getOrder());
    }

效果:
selectByOid():
在这里插入图片描述
selectByOrderItemId():
在这里插入图片描述
完成。

多对多

其实与上方的一对多已经涉及到了,下面我再复述一遍:
首先是通过Mybatis生成文件,(我使用的是书本,书本类别,书本类别对照表)
然后在书本类别对照表中进行操作,因为防止表污染,所以使用书本类别对照表来进行操作,因为这个表中的列段什么的基本不会更改,所以避免后期可能改表的情况。
HBookCategoryMapper.xml:

<resultMap id="HBookVoMap" type="com.zlk.model.vo.HBookVo" >
    <result property="bookId" column="book_id"></result>
    <result property="bookName" column="book_name"></result>
    <result property="price" column="price"></result>
    <collection property="categoryList" ofType="com.zlk.model.Category">
      <result property="categoryId" column="category_id"></result>
      <result property="categoryName" column="category_name"></result>
    </collection>
  </resultMap>

  <resultMap id="CategoryVoMap" type="com.zlk.model.vo.CategoryVo" >
    <result property="categoryId" column="category_id"></result>
    <result property="categoryName" column="category_name"></result>
    <collection property="HBookList" ofType="com.zlk.model.HBook">
      <result property="bookId" column="book_id"></result>
      <result property="bookName" column="book_name"></result>
      <result property="price" column="price"></result>
    </collection>
  </resultMap>

接口方法:

    HBookVo queryBiBid(@Param("bid") Integer bid);

    CategoryVo queryBiCid(@Param("cid") Integer cid);

sql:

  <select id="queryBiBid" resultMap="HBookVoMap" 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 b.book_id = #{bid}
  </select>
  <select id="queryBiCid" resultMap="CategoryVoMap" 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>

测试:
ManyToManyService接口:

public interface ManyToManyService {

    HBookVo queryBiBid(Integer bid);

    CategoryVo queryBiCid(Integer cid);
}

实现接口:

@Service
public class ManyToManyServiceImpl implements ManyToManyService {
    @Autowired
    private HBookCategoryMapper hBookCategoryMapper;

    @Override
    public HBookVo queryBiBid(Integer bid) {
       return  hBookCategoryMapper.queryBiBid(bid);
    }

    @Override
    public CategoryVo queryBiCid(Integer cid) {
        return hBookCategoryMapper.queryBiCid(cid);
    }
}

测试Test:

public class ManyToManyServiceImplTest extends SpringBaseTest {
    @Autowired
    private ManyToManyService manyToManyService;

    @Test
    public void queryBiBid() {
        HBookVo hBooks = manyToManyService.queryBiBid(1);
        System.out.println(hBooks);
        List<Category> list = hBooks.getCategoryList();
        for (Category c : list) {
            System.out.println(c);
        }
    }

    @Test
    public void queryBiCid() {
        CategoryVo categorys = manyToManyService.queryBiCid(1);
        System.out.println(categorys);
        List<HBook> hBookList = categorys.getHBookList();
        for (HBook hBook : hBookList) {
            System.out.println(hBook);
        }
    }
}

结果:

queryBiBid:
在这里插入图片描述
queryBiCid:
在这里插入图片描述

完成!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值