为你解决在Mybatis中的疑惑?Mybatis中【关联关系映射】

一.介绍Mybatis中【关联关系映射】

1.什么是Mybatis中【关联关系映射】?

可以实现不同实体之间的关联查询和映射。关联关系映射可以将多个实体对象之间的关联关系通过数据库查询进行映射,实现对象之间的关联操作。

2.常见的Mybatis【关联关系映射】

2.1.一对一关联 

一对一关联是指两个实体对象之间存在唯一的关系。在数据库中,这种关系通常通过外键来表示。在MyBatis中,可以使用ResultMap来实现一对一关联映射。通过定义ResultMap的<association>元素,可以指定关联对象的属性与数据库字段的对应关系

2.2.一对多关联

 一对多关联是指一个实体对象对应多个关联对象。在数据库中,通常使用外键来表示这种关系。MyBatis通过使用Collection或者Map来实现一对多关联映射。可以使用ResultMap的<collection>元素来定义关联对象集合属性与数据库字段的对应关系,也可以使用<map>元素来实现Map类型的关联映射。

2.3.多对多关联

是指两个实体对象之间存在互相关联的关系,即一个实体对象可以对应多个另一个实体对象,而另一个实体对象也可以对应多个该实体对象。在数据库中,多对多关联通常通过中间表来实现。

 二.通过举出具体实例来验证:关联关系映射

1.具体实现思路

1.1定义实体对象,创建映射文件

 首先,通过插件来自动生成两个实体对象,例如A和B。它们之间的多对多关联关系由中间表C来表示。在生成实体时映射文件会自动生成出来,并分别定义实体对象A和B的SQL语句以及ResultMap。

1.2定义多对多关联关系

 在映射文件中,使用<collection>元素或者<association>元素来定义多对多关联关系。对于多对多关联,需要通过设置<collection>元素的property属性来指定实体对象A中存放实体对象B集合的属性名,并通过<collection>元素的select属性来引用查询实体对象B的SQL语句。

1.3编写SQL语句:

在映射文件中编写查询语句,以获取实体对象A和B之间的关联信息。这个查询语句通常会包含多个表的联接操作,以及条件的限制。

通过以上步骤,就可以在MyBatis中实现多对多关联映射。在查询时,可以通过调用相应的Mapper接口方法来获取实体对象A及其关联的实体对象B的信息,或者反过来获取实体对象B及其关联的实体对象A的信息。

2.一对多具体实例展示(一个订单对应多个订单项)

2.1生成实体,映射文件(在这里小编生成了所有的后面就不在描述)

 

 2.2在OrderMapper.xml中配置sql,以及映射

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

 然后再将OrderVoMap添加到 resultmap中

2.3创建一个Vo来实现辅佐方法的实现

package com.lz.vo;

import com.lz.model.Order;
import com.lz.model.OrderItem;

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

/**
 * @author lz
 * @create 2023-08-26 15:31
 */

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;
    }
}

2.4就是创建接口并且实现方法,

package com.lz.biz.impl;

import com.lz.mapper.OrderMapper;
import com.lz.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author lz
 * @create 2023-08-25 15:54
 */
@Service
public class OrderBizImpl implements OrderBiz{
    @Autowired
    private OrderMapper  orderMapper;

    @Override
    public OrderVo SelectbyOid(Integer oid) {
        return  OrderMapper.SelectbyOid(oid);
    }
}

2.5通过juint测试,返回结果

package com.lz.biz.impl;

import com.lz.vo.OrderVo;
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;

/**
 * @author lz
 * @create 2023-08-25 15:58
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})

public class OrderBizImplTest {
     @Autowired
     private OrderBiz  orderBiz;

     @Test
    public  void SelectbyOid(){
         OrderVo orderVo = OrderBiz.SelectbyOid(7);
         System.out.println(orderVo);
         orderVo.getOrderItems().forEach(System.out::println);

     }


}

 

 3.一对以具体实例展示(一个订单项对应一个订单)

3.1在OrderItemMapper.xml中配置sql,以及映射

 3.2创建一个Vo来实现辅佐方法的实现

package com.lz.vo;

import com.lz.model.Order;
import com.lz.model.OrderItem;

/**
 * @author lz
 * @create 2023-08-27 21:04
 */
public class OrderItemVo  extends OrderItem {
      private Order  order;

    public Order getOrder() {
        return order;
    }

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

3.3c创建接口,并且调用

package com.lz.biz;

import com.lz.vo.OrderItemVo;
import org.apache.ibatis.annotations.Param;

public interface OrderItemBiz {
    OrderItemVo   SelectByOiid(@Param("oiid") Integer oiid);
}
package com.lz.biz.impl;

import com.lz.biz.OrderItemBiz;
import com.lz.mapper.OrderMapper;
import com.lz.model.OrderItem;
import com.lz.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author lz
 * @create 2023-08-25 15:54
 */
@Service
public class OederItemBizImpl implements OrderItemBiz {
    @Autowired //相当于  set /get方法
    private OrderItemBiz  orderItemBiz;

    @Override
    public OrderItemVo SelectByOiid(Integer oiid) {
        return OrderItemBiz.SelectByOiid(oiid);
    }
}

3.4通过juint测试,返回结果

package com.lz.biz.impl;

import com.lz.biz.OrderBiz;
import com.lz.biz.OrderItemBiz;
import com.lz.vo.OrderItemVo;
import com.lz.vo.OrderVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.SystemEnvironmentPropertySource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author lz
 * @create 2023-08-25 15:58
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})

public class OrderBizImplTest {
     

     @Autowired
     private OrderItemBiz orderItemBiz;


    
    @Test
    public  void SelectByOiid(){
         OrderItemVo  orderItemVo= OrderItemBiz.SelectByOiid(27);
        System.out.println(orderItemVo);
        System.out.println(orderItemVo.getOrder());
    }



}

 4.多对多(举例一本书有多个类别,一个类别可以对应多本书)

4.1配置sql,以及映射

resultMap id="CategoryVo" type="com.lz.vo.CategoryVo" >
    <result  column="category_id"  property="categoryId"></result>
    <result column="category_name"  property="categoryName"></result>
    <collection property="books"  ofType="com.lz.model.HCategory">
      <result column="book_id"  property="bookId"></result>
    <result  column="book_name"  property="bookName"></result>
    <result  column="price"   property="price"></result>
    </collection>
  </resultMap>

  
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from t_hibernate_book_category
    where bcid = #{bcid,jdbcType=INTEGER}
  </select>

  <select id="selcetByBookId"  resultMap="HBookVo"  parameterType="java.lang.Integer">
        SELECT  *FROM  t_hibernate_book  b,
        t_hibernate_category c,
        t_hibernate_book_category bc
        where  b.book_id =bc.bid
        and bc.cid =c.category_id
        and b.book_id= ${bid}
  </select>

  <resultMap id="HBookVo" type="com.lz.vo.HBookVo" >
    <result column="book_id"  property="bookId"></result>
    <result  column="book_name"  property="bookName"></result>
    <result  column="price"   property="price"></result>
    <collection property="categories"  ofType="com.lz.model.HCategory">
      <result  column="category_id"  property="categoryId"></result>
      <result column="category_name"  property="categoryName"></result>
    </collection>
  </resultMap>

2.创建vo来实现辅佐方法实现
 

package com.lz.vo;

import com.lz.model.HBook;
import com.lz.model.HCategory;

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

/**
 * @author lz
 * @create 2023-08-28 13:48
 */
public class CategoryVo extends HCategory {
     List<HBook>  books=new ArrayList<>();

    public List<HBook> getBooks() {
        return books;
    }

    public void setBooks(List<HBook> books) {
        this.books = books;
    }
}
package com.lz.vo;

import com.lz.model.HBook;
import com.lz.model.HCategory;

import java.util.List;

/**
 * @author lz
 * @create 2023-08-28 12:38
 */
public class HBookVo  extends HBook {
     private List<HCategory>  hCategories;

    public List<HCategory> gethCategories() {
        return hCategories;
    }

    public void sethCategories(List<HCategory> hCategories) {
        this.hCategories = hCategories;
    }
}

4.3创建接口,并且调用

package com.lz.biz;

import com.lz.vo.HBookVo;
import org.apache.ibatis.annotations.Param;

public interface HBookBiz {


     HBookVo selcetByBookId(@Param("bid") Integer bid);
}
package com.lz.biz.impl;

import com.lz.biz.HBookBiz;
import com.lz.mapper.HBookMapper;
import com.lz.vo.HBookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author lz
 * @create 2023-08-25 15:54
 */
@Service
public class HBookBizImpl implements HBookBiz {
    @Autowired //相当于  set /get方法
    private HBookMapper  hBookMapper;


    @Override
    public HBookVo selcetByBookId(Integer bid) {
        return  HBookMapper. selcetByBookId(bid);
    }
}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默o。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值