Mybatis关联关系映射

发布于:2023-01-16 ⋅ 阅读:(238) ⋅ 点赞:(0)

哈喽铁子们今天分享Mybatis关联关系映射先看本次目录

目录

一,一对多关联关系

一对多的单方

Association:一对多的多方

二,多对多关联关系


一,一对多关联关系

首先先用逆向生成工具生成t_hibernate_order、t_hibernate_order_item

这两张表对应的model与mapper

通过以上表得以下代码

一对多的单方

实体类

Order

package com.tsq.ssm.model;
 
/**
 * 对应t_hibernate_order表
 */
public class Order {
    private Integer orderId;
 
    private String orderNo;
 
    public Order(Integer orderId, String orderNo) {
        this.orderId = orderId;
        this.orderNo = orderNo;
    }
 
    public Order() {
        super();
    }
 
    public Integer getOrderId() {
        return orderId;
    }
 
    public void setOrderId(Integer orderId) {
        this.orderId = orderId;
    }
 
    public String getOrderNo() {
        return orderNo;
    }
 
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
}

OrderVo

该类继承了以上实体类(相当于子类),以上实体类包含了所有的属性

package com.tsq.ssm.model.vo;
 
import com.tsq.ssm.model.Order;
import com.tsq.ssm.model.OrderItem;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * @author tsq
 * @site www.javadxy.com
 * @company ds公司
 * @create  2022-08-15 18:28
 *
 * vo类不仅包含当前表得信息,还能包含相关联表得信息
 *
 * 当前订单一定会有一个或多个订单项,多个订单项必须要集合进行接收
 */
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;
    }
 
}

OrderItem

package com.tsq.ssm.model;
 
public class OrderItem {
    private Integer orderItemId;
 
    private Integer productId;
 
    private Integer quantity;
 
    private Integer oid;
 
    public OrderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
        this.orderItemId = orderItemId;
        this.productId = productId;
        this.quantity = quantity;
        this.oid = oid;
    }
 
    public OrderItem() {
        super();
    }
 
    public Integer getOrderItemId() {
        return orderItemId;
    }
 
    public void setOrderItemId(Integer orderItemId) {
        this.orderItemId = orderItemId;
    }
 
    public Integer getProductId() {
        return productId;
    }
 
    public void setProductId(Integer productId) {
        this.productId = productId;
    }
 
    public Integer getQuantity() {
        return quantity;
    }
 
    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }
 
    public Integer getOid() {
        return oid;
    }
 
    public void setOid(Integer oid) {
        this.oid = oid;
    }
}

 配置文件

<resultMap id="OrderVoMap" type="com.javaxl.ssm.model.vo.OrderVo" >
  <result property="orderId" column="order_id"></result>
  <result property="orderNo" column="order_no"></result>
  <collection property="orderItems" ofType="com.javaxl.ssm.model.OrderItem">
    <result property="orderItemId" column="order_item_id"></result>
    <result property="oid" column="oid"></result>
    <result property="productId" column="product_id"></result>
    <result property="quantity" column="quantity"></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>

 数据库查询结果

解析:

以下配置代码是与实体类的属性一一对应的一个关系,在以上实体类总

type:里面放的是子类的全路径

column:对应数据库里面的属性

property:分别对应实体类里面的属性

collection:相当于一个容器

ofType:里面放OrderItem的全路径,一个OrderVo对应多个OrderItem
 

<resultMap id="OrderVoMap" type="com.javaxl.ssm.model.vo.OrderVo" >
  <result property="orderId" column="order_id"></result>
  <result property="orderNo" column="order_no"></result>
  <collection property="orderItems" ofType="com.javaxl.ssm.model.OrderItem">
    <result property="orderItemId" column="order_item_id"></result>
    <result property="oid" column="oid"></result>
    <result property="productId" column="product_id"></result>
    <result property="quantity" column="quantity"></result>
  </collection>
</resultMap>

 更新实体类

@Data相当于添加了set/get方法 同时添加了toSpring方法

package com.tsq.ssm.model;
 
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
 
/**
 * 对应t_hibernate_order表
 */
//相当于添加了set/get方法 同时添加了toSpring方法
//@NoArgsConstructor
//@AllArgsConstructor
@Data
public class Order {
    private Integer orderId;
 
    private String orderNo;
 
}

Association:一对多的多方

配置文件

<resultMap id="OrderVoMap" type="com.javaxl.ssm.model.vo.OrderItemVo" >
  <result property="orderItemId" column="order_item_id"></result>
  <result property="oid" column="oid"></result>
  <result property="productId" column="product_id"></result>
  <result property="quantity" column="quantity"></result>
  <association property="order" javaType="com.javaxl.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>

实体类

package com.tsq.ssm.model;
 
import lombok.ToString;
 
@ToString
public class OrderItem {
    private Integer orderItemId;
 
    private Integer productId;
 
    private Integer quantity;
 
    private Integer oid;
 
    public OrderItem(Integer orderItemId, Integer productId, Integer quantity, Integer oid) {
        this.orderItemId = orderItemId;
        this.productId = productId;
        this.quantity = quantity;
        this.oid = oid;
    }
 
    public OrderItem() {
        super();
    }
 
    public Integer getOrderItemId() {
        return orderItemId;
    }
 
    public void setOrderItemId(Integer orderItemId) {
        this.orderItemId = orderItemId;
    }
 
    public Integer getProductId() {
        return productId;
    }
 
    public void setProductId(Integer productId) {
        this.productId = productId;
    }
 
    public Integer getQuantity() {
        return quantity;
    }
 
    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }
 
    public Integer getOid() {
        return oid;
    }
 
    public void setOid(Integer oid) {
        this.oid = oid;
    }
}

接口类

package com.tsq.ssm.mapper;
 
import com.tsq.ssm.model.OrderItem;
import com.tsq.ssm.model.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;
 
public interface OrderItemMapper {
 
    OrderItemVo queryOrderItemVoByOrderItemId(@Param("orderItemId") Integer orderItemId);
 
}

实现类

注意:@Service注解一定要记得写
package com.tsq.ssm.Biz;
 
import com.tsq.ssm.mapper.OrderItemMapper;
import com.tsq.ssm.model.OrderItem;
import com.tsq.ssm.model.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
 
/**
 * @author tsq
 * @site www.javadxy.com
 * @company ds公司
 * @create  2022-08-15 20:05
 */
@Service
public class OrderItemBizImpl implements OrderItemBiz {
    @Autowired
    private OrderItemMapper orderItemMapper;
 
 
    @Override
    public OrderItemVo queryOrderItemVoByOrderItemId(Integer orderItemId) {
        return orderItemMapper.queryOrderItemVoByOrderItemId(orderItemId);
    }
 
 
 
}

测试类

package com.tsq.ssm.Biz.impl;
 
import com.tsq.ssm.Biz.OrderItemBiz;
import com.tsq.ssm.model.vo.OrderItemVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import static org.junit.Assert.*;
 
/**
 * @author tsq
 * @site www.javadxy.com
 * @company ds公司
 * @create  2022-08-15 20:07
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
 
public class OrderItemBizImplTest {
    @Autowired
    private OrderItemBiz orderItemBiz;
 
 
    @Test
    public void queryOrderItemVoByOrderItemId() {
        OrderItemVo orderItemVo = orderItemBiz.queryOrderItemVoByOrderItemId(43);
        System.out.println(orderItemVo);
        System.out.println(orderItemVo.getOrder());
    }
}

《效果图》

二,多对多关联关系


首先先用逆向生成工具生成t_hibernate_book、t_hibernate_book_category、t_hibernate_category,这两张表对应的model与mapper

相当于两个一对多

需求:

 1.根据书籍ID,查询书籍信息及所属所有类别信息

 2.根据类别ID,查询类别信息及所包含书籍信息

配置文件
 

<resultMap id="HbookVoMap" type="com.tsq.ssm.model.vo.HbookVo">
    <result property="bookId" column="book_id"></result>
    <result property="bookName" column="book_name"></result>
    <collection property="categories" ofType="com.tsq.ssm.model.Category">
      <result property="categoryId" column="category_id"></result>
      <result property="categoryName" column="category_name"></result>
    </collection>
  </resultMap>
 
  <resultMap id="CategoryVoMap" type="com.tsq.ssm.model.vo.CategoryVo">
    <result property="categoryId" column="category_id"></result>
    <result property="categoryName" column="category_name"></result>
    <collection property="hbooks" ofType="com.tsq.ssm.model.Hbook">
      <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>
 

 实体类

package com.tsq.ssm.model;
 
import lombok.ToString;
 
@ToString
public class Hbook {
    private Integer bookId;
 
    private String bookName;
 
    private Float price;
 
    public Hbook(Integer bookId, String bookName, Float price) {
        this.bookId = bookId;
        this.bookName = bookName;
        this.price = price;
    }
 
    public Hbook() {
        super();
    }
 
    public Integer getBookId() {
        return bookId;
    }
 
    public void setBookId(Integer bookId) {
        this.bookId = bookId;
    }
 
    public String getBookName() {
        return bookName;
    }
 
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
 
    public Float getPrice() {
        return price;
    }
 
    public void setPrice(Float price) {
        this.price = price;
    }
}

实体子类

package com.tsq.ssm.model.vo;
 
import com.tsq.ssm.model.Category;
import com.tsq.ssm.model.Hbook;
 
import java.util.List;
 
/**
 * @author tsq
 * @site www.javadxy.com
 * @company ds公司
 * @create  2022-08-15 20:58
 */
public class HbookVo extends Hbook {
 
    private List<Category> categories;
 
    public List<Category> getCategories() {
        return categories;
    }
 
    public void setCategories(List<Category> categories) {
        this.categories = categories;
    }
}
package com.tsq.ssm.model.vo;
 
import com.tsq.ssm.model.Hbook;
 
import java.util.List;
 
/**
 * @author tsq
 * @site www.javadxy.com
 * @company ds公司
 * @create  2022-08-15 20:59
 */
public class CategoryVo {
    private List<Hbook> hbooks;
 
    public List<Hbook> getHbooks() {
        return hbooks;
    }
 
    public void setHbooks(List<Hbook> hbooks) {
        this.hbooks = hbooks;
    }
}

接口类

package com.tsq.ssm.Biz;
 
import com.tsq.ssm.mapper.HbookCategoryMapper;
import com.tsq.ssm.model.HbookCategory;
import com.tsq.ssm.model.vo.CategoryVo;
import com.tsq.ssm.model.vo.HbookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
/**
 * @author tsq
 * @site www.javadxy.com
 * @company ds公司
 * @create  2022-08-15 21:06
 */
@Service
public class HbookCategoryBizImpl implements HbookCategoryBiz {
   @Autowired
   private HbookCategoryMapper hbookCategoryMapper;
    
 
    public HbookVo queryByBookId(Integer bookId) {
        return hbookCategoryMapper.queryByBookId(bookId);
    }
 
    @Override
    public CategoryVo queryByCid(Integer cid) {
        return hbookCategoryMapper.queryByCid(cid);
    }
}

Servlet层

package com.tsq.ssm.Biz;
 
import com.tsq.ssm.model.HbookCategory;
import com.tsq.ssm.model.vo.CategoryVo;
import com.tsq.ssm.model.vo.HbookVo;
import org.apache.ibatis.annotations.Param;
 
public interface HbookCategoryBiz {
    
 
    HbookVo queryByBookId(Integer bookId);
 
    CategoryVo queryByCid(Integer cid);
 
}

实现类

package com.tsq.ssm.Biz.impl;
 
import com.tsq.ssm.Biz.HbookCategoryBiz;
import com.tsq.ssm.mapper.HbookCategoryMapper;
import com.tsq.ssm.model.HbookCategory;
import com.tsq.ssm.model.vo.CategoryVo;
import com.tsq.ssm.model.vo.HbookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
/**
 * @author tsq
 * @site www.javadxy.com
 * @company ds公司
 * @create  2022-08-15 21:06
 */
@Service
public class HbookCategoryBizImpl implements HbookCategoryBiz {
   @Autowired
 
   private HbookCategoryMapper hbookCategoryMapper;
   
 
 
    public HbookVo queryByBookId(Integer bookId) {
        return hbookCategoryMapper.queryByBookId(bookId);
    }
 
    @Override
    public CategoryVo queryByCid(Integer cid) {
        return hbookCategoryMapper.queryByCid(cid);
    }
}

测试类

package com.tsq.ssm.Biz;
 
import com.tsq.ssm.model.Category;
import com.tsq.ssm.model.Hbook;
import com.tsq.ssm.model.vo.CategoryVo;
import com.tsq.ssm.model.vo.HbookVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import static org.junit.Assert.*;
 
/**
 * @author tsq
 * @site www.javadxy.com
 * @company ds公司
 * @create  2022-08-15 21:09
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
 
public class HbookCategoryBizImplTest {
   @Autowired
   private HbookCategoryBiz hbookCategoryBiz;
 
    @Test
    public void queryByBookId() {
        HbookVo hbookVo = hbookCategoryBiz.queryByBookId(8);
        System.out.println(hbookVo);
        for (Category category : hbookVo.getCategories()) {
            System.out.println(category);
        }
    }
 
    @Test
    public void queryByCid() {
        CategoryVo categoryVo = hbookCategoryBiz.queryByCid(8);
        System.out.println(categoryVo);
        for (Hbook hbook : categoryVo.getHbooks()) {
            System.out.println(hbook);
        }
    }
}

好了Mybatis关联关系映射本次分享结束了我们下次见


网站公告

今日签到

点亮在社区的每一天
去签到