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

简介: 为你解决在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);
    }
}

 

相关文章
|
8月前
|
XML Oracle Java
mybatis反向生成实体类、dao层以及映射文件
mybatis反向生成实体类、dao层以及映射文件
|
8月前
|
SQL Java 数据库连接
|
8月前
|
Java 数据库连接 Maven
使用mybatis插件generator生成实体类,dao层和mapper映射
使用mybatis插件generator生成实体类,dao层和mapper映射
523 0
|
8月前
|
SQL Java 数据库连接
MyBatis映射文件深入
MyBatis映射文件深入
91 0
|
2月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
4月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
6月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
122 3
|
8月前
|
XML Java 数据库连接
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
168 0
|
7月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
82 3
|
7月前
|
Java 关系型数据库 数据库连接
【MyBatis】初步解析MyBatis:实现数据库交互与关系映射的全面指南
【MyBatis】初步解析MyBatis:实现数据库交互与关系映射的全面指南
515 1