mybatis关联关系映射

本文详细介绍了在ORM框架中如何处理一对多和多对多的关系映射,包括使用MyBatis进行表结构定义、实体类扩展、Mapper文件配置及查询语句编写,实现了从数据库到Java对象的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一对多

首先先用逆向生成工具生成t_hibernate_order、t_hibernate_order_item
这两张表对应的model与mapper
generatorConfig.xml添加

<!--订单表-->
        <table schema="" tableName="t_hibernate_order" domainObjectName="Order"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <!-- 忽略列,不生成bean 字段 -->
            <!-- <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 -->
            <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
        </table>
        <!--订单项表-->
        <table schema="" tableName="t_hibernate_order_item" domainObjectName="OrderItems"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <!-- 忽略列,不生成bean 字段 -->
            <!-- <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 -->
            <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
        </table>

OrderVo.java

package com.hsl.ssm.model.vo;

import com.hsl.ssm.model.Order;
import com.hsl.ssm.model.OrderItems;

import java.util.List;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 20:56
 */
public class OrderVo extends Order {
 private List<OrderItems> orderItems;

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

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

}

OrderItemsVo.java

package com.hsl.ssm.model.vo;

import com.hsl.ssm.model.Order;
import com.hsl.ssm.model.OrderItems;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 20:59
 */
public class OrderItemsVo extends OrderItems {
    private Order order;

    public Order getOrder() {
        return order;
    }

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

OrderMapper.xml添加映射

 <resultMap id="OrderVoMap" type="com.hsl.ssm.model.vo.OrderVo" >
   <result property="orderId" column="order_id"></result>
    <result property="orderNo" column="order_no"></result>
    <collection property="orderItems" ofType="com.hsl.ssm.model.OrderItems">
      <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>

OrderItemsMapper.xml添加映射

<resultMap id="OrderItemsVoMap" type="com.hsl.ssm.model.vo.OrderItemsVo" >
    <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.hsl.ssm.model.Order">
      <result property="orderId" column="order_id"></result>
      <result property="orderNo" column="order_no"></result>
    </association>
  </resultMap>

查询语句

<select id="queryOrderItemVoByOrderItemId" resultMap="OrderVoMap" 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>

改变OrderMapper.java

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

改变OrderMapperItem.java

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

测试
创建OneToManyService.java

package com.hsl.ssm.service;

import com.hsl.ssm.model.vo.OrderItemsVo;
import com.hsl.ssm.model.vo.OrderVo;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 21:23
 */
public interface OneToManyService {

    OrderVo queryOrderVoByOrderId(Integer orderId);

    OrderItemsVo queryOrderItemVoByOrderItemId(Integer orderItemId);
}

实现类

package com.hsl.ssm.service.impl;

import com.hsl.ssm.mapper.OrderItemsMapper;
import com.hsl.ssm.mapper.OrderMapper;
import com.hsl.ssm.model.vo.OrderItemsVo;
import com.hsl.ssm.model.vo.OrderVo;
import com.hsl.ssm.service.OneToManyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 21:36
 */
@Service
public class OneToManyServiceImpl implements OneToManyService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private OrderItemsMapper orderItemsMapper;
    @Override
    public OrderVo queryOrderVoByOrderId(Integer orderId) {
        return orderMapper.queryOrderVoByOrderId(orderId);
    }

    @Override
    public OrderItemsVo queryOrderItemVoByOrderItemId(Integer orderItemId) {
        return orderItemsMapper.queryOrderItemVoByOrderItemId(orderItemId);
    }
}

测试类

package com.hsl.ssm.service.impl;

import com.hsl.ssm.SpringBaseTest;
import com.hsl.ssm.model.OrderItems;
import com.hsl.ssm.model.vo.OrderItemsVo;
import com.hsl.ssm.model.vo.OrderVo;
import com.hsl.ssm.service.OneToManyService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import static org.junit.Assert.*;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 21:42
 */
public class OneToManyServiceImplTest extends SpringBaseTest {

    @Autowired
    private OneToManyService oneToManyService;

    @Test
    public void queryOrderVoByOrderId() {
        OrderVo orderVo=oneToManyService.queryOrderVoByOrderId(8);
        System.out.println("订单名:"+orderVo.getOrderNo());
        for (OrderItems orderItem : orderVo.getOrderItems()) {
            System.out.println("订单项信息" + orderItem);
        }
    }

    @Test
    public void queryOrderItemVoByOrderItemId() {
        OrderItemsVo orderItemsVo = oneToManyService.queryOrderItemVoByOrderItemId(36);
        System.out.println("订单项信息为"+orderItemsVo);
        System.out.println("对应的订单名"+orderItemsVo.getOrder().getOrderNo());
    }
}

结果:
在这里插入图片描述
在这里插入图片描述

多对多

generatorConfig.xml添加

   <!--书籍表-->
        <table schema="" tableName="t_hibernate_book" domainObjectName="HBooks"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <!-- 忽略列,不生成bean 字段 -->
            <!-- <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 -->
            <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
        </table>
        <!--书记类别表-->
        <table schema="" tableName="t_hibernate_category" domainObjectName="Category"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <!-- 忽略列,不生成bean 字段 -->
            <!-- <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 -->
            <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
        </table>
<!--书籍类别中间表-->
        <table schema="" tableName="t_hibernate_book_category" domainObjectName="HBooksCategory"
               enableCountByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" enableUpdateByExample="false">
            <!-- 忽略列,不生成bean 字段 -->
            <!-- <ignoreColumn column="FRED" /> -->
            <!-- 指定列的java数据类型 -->
            <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
        </table>

HBooksVo.java

package com.hsl.ssm.model.vo;

import com.hsl.ssm.model.Category;
import com.hsl.ssm.model.HBooks;

import java.util.List;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 22:06
 */
public class HBooksVo extends HBooks {
    private List<Category> categories;

    public List<Category> getCategories() {
        return categories;
    }

    public void setCategories(List<Category> categories) {
        this.categories = categories;
    }
}

CategroyVo.java

package com.hsl.ssm.model.vo;

import com.hsl.ssm.model.Category;
import com.hsl.ssm.model.HBooks;

import java.util.List;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 22:07
 */
public class CategoryVo extends Category {
    private List<HBooks> hBooks;

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

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


HBooksCategoryMapper.xml添加映射

<resultMap id="HBookVoMap" type="com.hsl.ssm.model.vo.HBooksVo">
    <result property="bookId" column="book_id"></result>
    <result property="bookName" column="book_name"></result>
    <collection property="categories" ofType="com.hsl.ssm.model.Category">
      <result property="categoryId" column="category_id"></result>
      <result property="categoryName" column="category_name"></result>
    </collection>
  </resultMap>

  <resultMap id="CategoryVoMap" type="com.hsl.ssm.model.vo.CategoryVo">
    <result property="categoryId" column="category_id"></result>
    <result property="categoryName" column="category_name"></result>
    <collection property="hBooks" ofType="com.hsl.ssm.model.HBooks">
      <result property="bookId" column="book_id"></result>
      <result property="bookName" column="book_name"></result>
    </collection>
  </resultMap>

查询语句

  <select id="queryByBookId" 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 = #{bookId}
 </select>
 
  <select id="queryByCid" 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>

改变HBooksCategoryMapper.java

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

改变OrderMapperItem.java

 HBooksVo queryByBookId(@Param("bookId") Integer bookId);

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

测试
创建ManyToManyService.java

package com.hsl.ssm.service;

import com.hsl.ssm.model.vo.CategoryVo;
import com.hsl.ssm.model.vo.HBooksVo;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 22:18
 */
public interface ManyToManyService {
    HBooksVo queryByBookId( Integer bookId);

    CategoryVo queryByCid( Integer cid);
}


实现类

package com.hsl.ssm.service.impl;

import com.hsl.ssm.mapper.HBooksCategoryMapper;
import com.hsl.ssm.model.vo.CategoryVo;
import com.hsl.ssm.model.vo.HBooksVo;
import com.hsl.ssm.service.ManyToManyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 22:22
 */
@Service
public class ManyToManyServiceImpl implements ManyToManyService {
    @Autowired
    private HBooksCategoryMapper hBooksCategoryMapper;
    @Override
    public HBooksVo queryByBookId(Integer bookId) {
        return hBooksCategoryMapper.queryByBookId(bookId);
    }

    @Override
    public CategoryVo queryByCid(Integer cid) {
        return hBooksCategoryMapper.queryByCid(cid);
    }
}

测试类

package com.hsl.ssm.service.impl;

import com.hsl.ssm.SpringBaseTest;
import com.hsl.ssm.model.Category;
import com.hsl.ssm.model.HBooks;
import com.hsl.ssm.model.vo.CategoryVo;
import com.hsl.ssm.model.vo.HBooksVo;
import com.hsl.ssm.service.ManyToManyService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author water
 * @site www.water.com
 * @company xxx公司
 * @create 2019-11-20 22:25
 */
public class ManyToManyServiceImplTest extends SpringBaseTest {
    @Autowired
    private ManyToManyService manyToManyService;

    @Test
    public void queryByBookId() {
        HBooksVo hBooksVo = manyToManyService.queryByBookId(8);
        System.out.println("书籍信息"+hBooksVo);
        for (Category category : hBooksVo.getCategories()) {
            System.out.println("类别"+category);
        }

    }

    @Test
    public void queryByCid() {

        CategoryVo categoryVo = manyToManyService.queryByCid(8);
        System.out.println("类别"+categoryVo);
        for (HBooks hBooks : categoryVo.gethBooks()) {
            System.out.println("书籍"+hBooks);
        }

    }
}

结果:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值