• MyBatis中至关重要的关系映射----全方面介绍


    目录

    一 对于映射的概念

    1.1 三种关系映射

    1.2 resultType与resultMap的区别

    resultType:

    resultMap:

    二,一对一关联查询

    2.1 嵌套结果集编写

    2.2 案例演示

    三,一对多关联查询

    3.1 嵌套结果集编写

     3.3 案例演示

    四,多对多关联查询 

    4.1 嵌套结果集编写

     4.2 案例演示

    一 对于映射的概念

         在关系型数据库中,表与表之间存在着三种关联映射关系,分别为一对一关系、一对多关系和多对多关系。  那在 MyBatis 中,通过 association 元素来处理对象与对象之间关联关系,association 元素提供了一系列属性用于维护数据表之间的关系。association 元素是 resultMap元素的子元素,它有两种配置方式,嵌套查询方式和嵌套结果集方式。

    1.1 三种关系映射

    一对一关联映射:

          这种关系表示两个实体类之间存在唯一的对应关系,通常通过在表之间使用外键来建立连接。在 MyBatis 中可以使用 association 元素来实现一对一关联映射

    一对多关联映射:

         这种关系表示一个实体类关联多个其他实体类的实例。例如,在数据库中,一个文章可以对应多个评论。在 MyBatis 中可以使用 collection 元素来实现一对多关联映射

    多对多关联映射:

             这种关系表示两个实体类之间存在多对多的关系,通常通过中间表来实现。例如,一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。在 MyBatis 中可以使用中间表和联合查询来实现多对多关联映射。

    1.2 resultType与resultMap的区别

    resultType:

    使用 resultType,我们直接指定了查询结果的类型,它通常用于简单的查询语句,不需要复杂的映射关系。优点是简单直观,缺点是不能进行复杂的映射操作(实体类没有该属性的情况)。

    resultMap:

        而使用 resultMap,我们可以更加灵活地映射查询结果到任意类型的 Java 对象上。通过定义一个 resultMap,我们可以指定每个查询结果列与 Java 对象属性之间的映射关系。优点是功能强大,可以进行各种复杂的映射操作,缺点是需要编写更多的 XML 配置代码

    二,一对一关联查询

    这里需要建一个VO类,VO是Value Object的缩写,是一轻量级的数据结构,用于在视图层与业务逻辑层之间传递数据。VO通常用于表示视图层所需的数据,这些数据来自于业务逻辑层或数据访问层。VO的主要目的是将业务逻辑层的数据结构转换为视图层可以使用的数据结构 。简单来说就是用于关系映射时的结果接收

    下面我们利用订单项以及订单来描述一对一的关系,所以我们建立一个OrderitemVo

    OrderitemVo:

    1. public class OrderitemVo extends Orderitem {
    2. private Order order;
    3. public Order getOrder() {
    4. return order;
    5. }
    6. public void setOrder(Order order) {
    7. this.order = order;
    8. }

    2.1 嵌套结果集编写

    1. <resultMap id="OrderitemvoMap" type="com.Bing.vo.OrderitemVo">
    2. <result column="order_item_id" property="orderItemId">result>
    3. <result column="product_id" property="productId">result>
    4. <result column="quantity" property="quantity">result>
    5. <result column="oid" property="oid">result>
    6. <association property="order" javaType="com.Bing.model.Order">
    7. <result column="order_id" property="orderId">result>
    8. <result column="order_no" property="orderNo">result>
    9. association>
    10. resultMap>
    11. <select id="selectByOiid" resultMap="OrderitemvoMap" parameterType="java.lang.Integer">
    12. select * from t_hibernate_order o,t_hibernate_order_item oi where o.order_id=oi.oid and oi.order_item_id=#{oiid}
    13. select>

    2.2 案例演示

    接口类并实现

    接口Biz编写:

    1. public interface OrderitemBiz {
    2. OrderitemVo selectByOiid(Integer oiid);
    3. }

    实现类Impl类继承Biz:

    1. @Service
    2. public class OrderitemImpl implements OrderitemBiz {
    3. @Autowired
    4. private OrderitemMapper OrderitemMapper;
    5. @Override
    6. public OrderitemVo selectByOiid(Integer oiid) {
    7. return OrderitemMapper.selectByOiid(oiid);
    8. }
    9. }

    Test类编写:

    1. @RunWith(SpringJUnit4ClassRunner.class)
    2. @ContextConfiguration(locations={"classpath:spring-context.xml"})
    3. public class OrderitemImplTest {
    4. @Autowired
    5. private OrderitemBiz OrderitemBiz;
    6. @Test
    7. public void selectByOiid() {
    8. OrderitemVo orderitemVo = OrderitemBiz.selectByOiid(27);
    9. System.out.println(orderitemVo);
    10. System.out.println(orderitemVo.getOrder());
    11. }
    12. }

    测试运行结果:

    三,一对多关联查询

    下面我们利用订单以及订单项来描述一对多的关系,所以我们建立一个OrderVo。

    注意:要使用list集合

    1. public class OrderVo extends Order {
    2. private List orderitems=new ArrayList<>();
    3. public List getOrderitems() {
    4. return orderitems;
    5. }
    6. public void setOrderitems(List orderitems) {
    7. this.orderitems = orderitems;
    8. }
    9. @Override
    10. public String toString() {
    11. return "OrderVo{" +
    12. "orderitems=" + orderitems +
    13. '}';
    14. }
    15. }

    3.1 嵌套结果集编写

    1. <resultMap id="OrderMap" type="com.Bing.vo.OrderVo" >
    2. <result column="order_id" property="orderId">result>
    3. <result column="order_no" property="orderNo">result>
    4. <collection property="orderitems" ofType="com.Bing.model.Orderitem">
    5. <result column="order_item_id" property="orderItemId">result>
    6. <result column="product_id" property="productId">result>
    7. <result column="quantity" property="quantity">result>
    8. <result column="oid" property="oid">result>
    9. collection>
    10. resultMap>
    11. <select id="byOid" resultMap="OrderMap" parameterType="java.lang.Integer" >
    12. select * from t_hibernate_order o,t_hibernate_order_item oi where o.order_id=oi.oid
    13. and o.order_id=#{oid}
    14. select>

     3.3 案例演示

    接口类并实现

    接口Biz编写:

    1. public interface OrderBiz {
    2. OrderVo byOid(Integer id);
    3. }

    实现Impl类继承Biz:

    1. @Service
    2. public class OrderBizImpl implements OrderBiz {
    3. @Autowired
    4. private OrderMapper orderMapper;
    5. @Override
    6. public OrderVo byOid(Integer id) {
    7. return orderMapper.byOid(id);
    8. }
    9. }

    Test类编写:

    1. @RunWith(SpringJUnit4ClassRunner.class)
    2. @ContextConfiguration(locations={"classpath:spring-context.xml"})
    3. public class OrderBizImplTest {
    4. @Autowired
    5. private OrderBiz orderBiz;
    6. @Test
    7. public void byOid() {
    8. OrderVo orderVo = orderBiz.byOid(7);
    9. System.out.println(orderVo);
    10. orderVo.getOrderitems().forEach(System.out::println);
    11. }
    12. }

    测试类运行结果:

    四,多对多关联查询 

    我们以书籍有多个类别以及每个类别又有多本书的这种关系来实操多对多关系的查询

    HbookVo:

    1. public class HbookVo extends HBook {
    2. private List hcategory;
    3. public List getHcategory() {
    4. return hcategory;
    5. }
    6. public void setHcategory(List hcategory) {
    7. this.hcategory = hcategory;
    8. }
    9. }

    4.1 嵌套结果集编写

    1. <resultMap id="HbookVo" type="com.Bing.vo.HbookVo" >
    2. <result column="book_id" property="bookId">result>
    3. <result column="book_name" property="bookName">result>
    4. <result column="price" property="price">result>
    5. <collection property="hcategory" ofType="com.Bing.model.HCategory">
    6. <result column="category_id" property="categoryId">result>
    7. <result column="category_name" property="categoryName">result>
    8. collection>
    9. resultMap>
    10. <select id="selectByBid" resultMap="HbookVo" parameterType="java.lang.Integer">
    11. SELECT
    12. *
    13. FROM
    14. t_hibernate_book b,
    15. t_hibernate_book_category bc,
    16. t_hibernate_category c
    17. WHERE
    18. b.book_id = bc.bid
    19. AND bc.cid = c.category_id
    20. AND b.book_id =#{bid}
    21. select>

     4.2 案例演示

    接口类并实现

    接口Biz编写:

    1. public interface HBookBiz {
    2. HbookVo selectByBid(Integer bid);
    3. }

    实现类Impl类继承Biz:

    1. @Service
    2. public class HBookBizImpl implements HBookBiz {
    3. @Autowired
    4. private HBookMapper hbookMapper;
    5. @Override
    6. public HbookVo selectByBid(Integer bid) {
    7. return hbookMapper.selectByBid(bid);
    8. }
    9. }

    Test类编写:

    1. @RunWith(SpringJUnit4ClassRunner.class)
    2. @ContextConfiguration(locations={"classpath:spring-context.xml"})
    3. public class HBookBizImplTest {
    4. @Autowired
    5. private HBookBiz hbookBiz;
    6. @Test
    7. public void selectByBid() {
    8. HbookVo hbookVo = hbookBiz.selectByBid(8);
    9. System.out.println(hbookVo);
    10. hbookVo.getHcategory().forEach(System.out::println);
    11. }
    12. }

    Test类运行结果:

                                    好啦,今天的分享就到这了,希望能够帮到你呢!😊😊   

  • 相关阅读:
    【Linux网络编程】多路IO转接之select、poll、epoll
    【Struts2框架】idea快速搭建struts2框架
    01_前端css编写的三种方式
    Unity 预制体放在场景中可见,通过代码复制出来不可见的处理
    成绩统计-蓝桥杯
    三、支付宝支付对接 - 申请、配置、签约、获取RSkey(1)
    vue全局设置传值到后台不能为null
    Linux——VIM编辑器(详细)
    Worthington用于细胞收获的胰蛋白酶&细胞释放程序
    Spark 之 Projection
  • 原文地址:https://blog.csdn.net/m0_73192864/article/details/132661283