【Mybatis】关联关系映射表对象之间的关系

【Mybatis】关联关系映射表对象之间的关系_第1张图片

 

目录

​编辑

1.概述

( 1 )  介绍

2.一对一关联映射 

2.1数据库表连接:

 2.2配置文件:

2.3生成自动代码

 2.4 编写测试 

3. 一对多关联映射

4.多对多关联映射


1.概述

( 1 )  介绍

关联关系映射是指在数据库中,通过定义表之间的关联关系,将多个表的数据进行关联查询和映射的过程。通过关联关系映射,可以方便地获取相关联表的数据,并将其映射到对应的实体类中。

Mybatis是一种Java持久层框架,它提供了一种将数据库表和Java对象之间进行关联关系映射的方式。在Mybatis中,可以通过配置文件或注解的方式,定义表之间的关联关系,并将查询结果映射到对应的Java对象中。通过Mybatis的关联关系映射,可以方便地进行复杂的数据库查询操作。

在Mybatis中,可以通过配置映射文件来实现关联关系的映射。通过定义实体类和映射文件,可以将数据库中的多个表进行关联查询,并将查询结果映射到实体类的属性上。

在进行数据库查询操作时,通过关联查询获取到关联表中的相关数据,并将其映射到实体类中的关联属性上。
总结来说,关联关系映射是指通过配置映射文件,将数据库中的关联表进行关联查询,并将查询结果映射到实体类的关联属性上。通过扩展关联关系映射,可以方便地进行复杂的数据库查询操作,提高查询效率和简化数据操作的代码。

( 2 )  关联关系映射

关联关系映射在Mybatis中主要通过三种方式实现:一对一关联和一对多关联及多对多关联。

一对一关联:
在一对一关联中,两个表之间存在一对一的关系,例如学生表和身份证表,一个学生只有一个身份证,而一个身份证也只属于一个学生。在Mybatis中,可以通过在实体类中定义关联属性,然后在映射文件中使用标签来定义关联关系。通过配置映射关系,可以查询到学生表和身份证表的数据,并将其映射到对应的实体类中。

一对多关联:
在一对多关联中,两个表之间存在一对多的关系,例如部门表和员工表,一个部门可以有多个员工,而一个员工只属于一个部门。在Mybatis中,可以通过在实体类中定义关联属性,然后在映射文件中使用标签来定义关联关系。通过配置映射关系,可以查询到部门表和员工表的数据,并将其映射到对应的实体类中。

多对多关联:

是指两个表之间存在多对多的关联关系,即一个表的一条记录可以对应另一个表的多条记录,反之亦然。在数据库中,多对多关系通常需要通过中间表来实现。

在Mybatis中,可以通过定义中间表来映射多对多关系。假设有两个表,学生表和课程表,一个学生可以选择多门课程,而一门课程也可以被多个学生选择。为了映射这种多对多关系,需要创建一个中间表,例如选课表,用来记录学生和课程的关联关系。
 

2.一对一关联映射 

2.1数据库表连接:

【Mybatis】关联关系映射表对象之间的关系_第2张图片

 2.2配置文件:

修改名为 generatorConfig.xml 的 配置文件




    
    

    
    

    
    
        
        
            
             
        

        
        

        
        
            
            
        

        
        
        
        
            
            
            
            
            
            
            
            
        

        
        
            
            
        

        
        
        
        
        
            
            
        

        
        
        
        
        
        
        
        
        
        
        
        
        

        

2.3生成自动代码

配置好 generatorConfig.xml 的配置文件后进行,自动生成代码

【Mybatis】关联关系映射表对象之间的关系_第3张图片

 代码生成后就会出现以下的实体类对象,配置文件,接口类

【Mybatis】关联关系映射表对象之间的关系_第4张图片

 然后将每个实体类对象里面重写一下toString()方法

 2.4 编写测试 

创建一个 名为 OrderItemVo 的类,继承OrderItem类,及属性有Order对象

package com.sy.vo;

import com.sy.model.Order;
import com.sy.model.OrderItem;

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-26 16:40
 */
public class OrderItemVo extends OrderItem {

    private Order order;

    public Order getOrder() {
        return order;
    }

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

在自动生成的OrderItemMapper.xml配置文件中进行增加以下配置




  
    
      
      
      
      
    
  
  
    order_item_id, product_id, quantity, oid
  

  
    
    
    
    
    
      
      
    
  


 




  
  
    delete from t_hibernate_order_item
    where order_item_id = #{orderItemId,jdbcType=INTEGER}
  
  
    insert into t_hibernate_order_item (order_item_id, product_id, quantity, 
      oid)
    values (#{orderItemId,jdbcType=INTEGER}, #{productId,jdbcType=INTEGER}, #{quantity,jdbcType=INTEGER}, 
      #{oid,jdbcType=INTEGER})
  
  
    insert into t_hibernate_order_item
    
      
        order_item_id,
      
      
        product_id,
      
      
        quantity,
      
      
        oid,
      
    
    
      
        #{orderItemId,jdbcType=INTEGER},
      
      
        #{productId,jdbcType=INTEGER},
      
      
        #{quantity,jdbcType=INTEGER},
      
      
        #{oid,jdbcType=INTEGER},
      
    
  
  
    update t_hibernate_order_item
    
      
        product_id = #{productId,jdbcType=INTEGER},
      
      
        quantity = #{quantity,jdbcType=INTEGER},
      
      
        oid = #{oid,jdbcType=INTEGER},
      
    
    where order_item_id = #{orderItemId,jdbcType=INTEGER}
  
  
    update t_hibernate_order_item
    set product_id = #{productId,jdbcType=INTEGER},
      quantity = #{quantity,jdbcType=INTEGER},
      oid = #{oid,jdbcType=INTEGER}
    where order_item_id = #{orderItemId,jdbcType=INTEGER}
  

在自动生成的 OrderItemMapper 接口中进行增加以下代码

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

创建一个接口名为 : OrderItemBiz 接口

package com.sy.biz;

import com.sy.vo.OrderItemVo;

public interface OrderItemBiz {


    OrderItemVo selectByOrderItemId(Integer oiid);
}

实现以上创建的接口,创建一个实现了名为 OrderItemBizImpl 类

package com.sy.biz.impl;

import com.sy.biz.OrderItemBiz;
import com.sy.mapper.OrderItemMapper;
import com.sy.vo.OrderItemVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-26 16:53
 */
@Service
public class OrderItemBizImpl implements OrderItemBiz {
    @Autowired
    private OrderItemMapper orderItemMapper;
    @Override
    public OrderItemVo selectByOrderItemId(Integer oiid) {
        return orderItemMapper.selectByOrderItemId(oiid);
    }
}

创建一个测试类进行方法测试

package com.sy.biz.impl;

import com.sy.biz.OrderBiz;
import com.sy.biz.OrderItemBiz;
import com.sy.vo.OrderItemVo;
import com.sy.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 谌艳
 * @site www.shenyan.com
 * @create 2023-08-26 15:56
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderBizImplTest {
@Autowired
private OrderBiz orderBiz;
@Autowired
private OrderItemBiz orderItemBiz;


    @Test
    public void selsctByOrderItemId() {
        OrderItemVo orderItemVo = orderItemBiz.selectByOrderItemId(27);
        System.out.println(orderItemVo);
        System.out.println(orderItemVo.getOrder());
    }




    @Test
    public void selsctByOid() {
        OrderVo orderVo = orderBiz.selsctByOid(7);
        System.out.println(orderVo);
        orderVo.getOrderItems().forEach(System.out::println);
    }
}

结果展示: 

【Mybatis】关联关系映射表对象之间的关系_第5张图片

3. 一对多关联映射

创建一个 名为 OrdeVo 的类,继承Order类,及属性有List集合

用来存储查询到的OrderItem对象,因为是一对多所有查询出有多个对象

package com.sy.vo;

import com.sy.model.Order;
import com.sy.model.OrderItem;

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

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-26 15:29
 */
public class OrderVo extends Order {

    private List orderItems=new ArrayList();


    public List getOrderItems() {
        return orderItems;
    }

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

}

在自动生成的 OrderMapper.xml 配置文件中增加以下配置




  
    
      
      
    
  
  
    order_id, order_no
  

  
    
    
    
      
      
      
      
    
  


  


  
  
    delete from t_hibernate_order
    where order_id = #{orderId,jdbcType=INTEGER}
  
  
    insert into t_hibernate_order (order_id, order_no)
    values (#{orderId,jdbcType=INTEGER}, #{orderNo,jdbcType=VARCHAR})
  
  
    insert into t_hibernate_order
    
      
        order_id,
      
      
        order_no,
      
    
    
      
        #{orderId,jdbcType=INTEGER},
      
      
        #{orderNo,jdbcType=VARCHAR},
      
    
  
  
    update t_hibernate_order
    
      
        order_no = #{orderNo,jdbcType=VARCHAR},
      
    
    where order_id = #{orderId,jdbcType=INTEGER}
  
  
    update t_hibernate_order
    set order_no = #{orderNo,jdbcType=VARCHAR}
    where order_id = #{orderId,jdbcType=INTEGER}
  

在自动生成的 OrderMapper接口中进行增加以下代码

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

创建一个接口名为 : OrderBiz 接口

package com.sy.biz;

import com.sy.vo.OrderVo;

public interface OrderBiz {

    OrderVo selsctByOid(Integer Oid);
}

在实现以上 OrderBiz 接口,创建一个实现类,名为 OrderBizImpl 

package com.sy.biz.impl;

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

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-26 15:53
 */
@Service
public class OrderBizImpl implements OrderBiz {
    @Autowired
    private OrderMapper orderMapper;

    @Override
    public OrderVo selsctByOid(Integer Oid) {
        return orderMapper.selectByOid(Oid);
    }
}

在测试类中测试方法及接口

【Mybatis】关联关系映射表对象之间的关系_第6张图片

4.多对多关联映射

在自动生成的 HBookMapper.xml 配置文件中增加以下配置




  
    
      
      
      
    
  
  
    book_id, book_name, price
  

    
    
    
    
    
      
      
    
  


  




  
  
    delete from t_hibernate_book
    where book_id = #{bookId,jdbcType=INTEGER}
  
  
    insert into t_hibernate_book (book_id, book_name, price
      )
    values (#{bookId,jdbcType=INTEGER}, #{bookName,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
      )
  
  
    insert into t_hibernate_book
    
      
        book_id,
      
      
        book_name,
      
      
        price,
      
    
    
      
        #{bookId,jdbcType=INTEGER},
      
      
        #{bookName,jdbcType=VARCHAR},
      
      
        #{price,jdbcType=REAL},
      
    
  
  
    update t_hibernate_book
    
      
        book_name = #{bookName,jdbcType=VARCHAR},
      
      
        price = #{price,jdbcType=REAL},
      
    
    where book_id = #{bookId,jdbcType=INTEGER}
  
  
    update t_hibernate_book
    set book_name = #{bookName,jdbcType=VARCHAR},
      price = #{price,jdbcType=REAL}
    where book_id = #{bookId,jdbcType=INTEGER}
  

在自动生成的 HBookMapper 接口 中增加以下方法

 HbookVo selectByBidMap(@Param("bid") Integer bid);

创建一个接口名为 HBookBiz 

package com.sy.biz;

import com.sy.vo.HbookVo;
import org.apache.ibatis.annotations.Param;

public interface HBookBiz {

    HbookVo selectByBidMap(@Param("bid") Integer bid);

}

在实现以上 HBookBiz 接口,创建一个实现类,名为 HBookBizImpl 

package com.sy.biz.impl;

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

/**
 * @author 谌艳
 * @site www.shenyan.com
 * @create 2023-08-26 22:09
 */
@Service
public class HBookBizImpl implements HBookBiz {

    @Autowired
    private HBookMapper hbookMapper;

    @Override
    public HbookVo selectByBidMap(Integer bid) {
        return hbookMapper.selectByBidMap(bid);
    }
}

在测试类中下测试方法及接口

package com.sy.biz.impl;

import com.sy.biz.HBookBiz;
import com.sy.biz.HCategoryBiz;
import com.sy.vo.CategoryVo;
import com.sy.vo.HbookVo;
import org.junit.After;
import org.junit.Before;
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 谌艳
 * @site www.shenyan.com
 * @create 2023-08-26 22:11
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HBookBizImplTest {

    @Autowired
    private HBookBiz hbookBiz;
    @Autowired
    private HCategoryBiz hcategoryBiz;


    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void selectByBidMap() {
        HbookVo hbookVo = hbookBiz.selectByBidMap(8);
        System.out.println(hbookVo);
        hbookVo.gethCategories().forEach(System.out::println);
    }

    @Test
    public void selectByCategorYId() {
        CategoryVo categoryVo = hcategoryBiz.selectByCategoryId(8);
        System.out.println(categoryVo);
        categoryVo.getBooks().forEach(System.out::println);
    }



}

结果展示:

【Mybatis】关联关系映射表对象之间的关系_第7张图片

你可能感兴趣的:(spring,idea,java,mybatis,log4j)