Java工程mybatis实现多表查询过程详解

关于Java工程mybatis实现多表查询的过程,我会为你提供详细的攻略。

什么是mybatis

先了解什么是mybatis,MyBatis是一个开源的、基于 Java 的持久层框架。通过XML描述符或注释来将对象与存储过程或 SQL 语句绑定起来,实现了将程序中的 Java 对象和数据库中的数据进行映射,使得数据的操作和 Java 代码的操作可以分离。

如何实现多表查询

在mybatis中实现多表查询需要用到联表查询的知识,而联表查询需要遵循以下步骤:

步骤一:建立实体类

首先创建需要查询的实体类,这里以订单和订单项为例,建立两个实体类Order和OrderItem。

步骤二:建立Mapper

在mapper接口中建立查询订单及订单项的方法,方法中通过sql语句使用联表查询,如下:

public interface OrderMapper {
    /**
     * 根据订单ID查询订单及订单项,使用联表查询
     *
     * @param orderId 订单ID
     * @return 订单及订单项列表
     */
    List<OrderAndItem> queryOrderAndItemById(int orderId);
}

在mapper XML文件夹中编写查询语句,如下:

<select id="queryOrderAndItemById" resultMap="OrderAndItemMap">
    SELECT
        o.*,
        oi.*
    FROM
        tb_order as o
        LEFT JOIN tb_order_item as oi ON o.id = oi.order_id
    WHERE
        o.id = #{orderId}
</select>

步骤三:建立ResultMap

在mapper XML文件夹中创建ResultMap,来映射联表查询后的结果,如下:

<resultMap id="OrderAndItemMap" type="com.example.OrderAndItem">
    <result property="orderId" column="id"/>
    <result property="orderNo" column="order_no"/>
    ...
    <result property="itemId" column="id"/>
    <result property="orderItemId" column="order_id"/>
    ...
</resultMap>

步骤四:建立业务处理类

最后,在业务处理类中调用mapper的查询方法,并将结果映射到对应的实体类中。如下:

public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    public OrderAndItem queryOrderAndItemById(int orderId){
        List<OrderAndItem> list = orderMapper.queryOrderAndItemById(orderId);
        OrderAndItem orderAndItem = null;
        if(list.size() > 0){
            orderAndItem = list.get(0);
        }
        return orderAndItem;
    }
}

示例

示例一

假设有订单和订单项两张表,同时需要查询订单及订单项的详细信息,可以使用以下代码:

public interface OrderMapper {
    /**
     * 根据订单ID查询订单及订单项,使用联表查询
     *
     * @param orderId 订单ID
     * @return 订单及订单项列表
     */
    List<OrderAndItem> queryOrderAndItemById(int orderId);
}

@Mapper
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    public OrderAndItem queryOrderAndItemById(int orderId){
        List<OrderAndItem> list = orderMapper.queryOrderAndItemById(orderId);
        OrderAndItem orderAndItem = null;
        if(list.size() > 0){
            orderAndItem = list.get(0);
        }
        return orderAndItem;
    }
}

@Data
public class Order {
    private Integer id;
    private String orderNo;
    ...
}

@Data
public class OrderItem {
    private Integer id;
    private Integer orderId;
    ...
}

@Data
public class OrderAndItem {
    private Integer orderId;
    private String orderNo;
    ...
    private Integer itemId;
    private Integer orderItemId;
    ...
}

<select id="queryOrderAndItemById" resultMap="OrderAndItemMap">
    SELECT
        o.*,
        oi.*
    FROM
        tb_order as o
        LEFT JOIN tb_order_item as oi ON o.id = oi.order_id
    WHERE
        o.id = #{orderId}
</select>

<resultMap id="OrderAndItemMap" type="com.example.OrderAndItem">
    <result property="orderId" column="id"/>
    <result property="orderNo" column="order_no"/>
    ...
    <result property="itemId" column="id"/>
    <result property="orderItemId" column="order_id"/>
    ...
</resultMap>

示例二

假设有商品表、订单表和订单项表三张表,需要查询订单详细信息及对应的商品信息,可以使用以下代码:

public interface OrderMapper {
    /**
     * 查询订单详情及对应商品信息
     *
     * @param orderId 订单ID
     * @return 订单详情及对应商品信息
     */
    List<OrderDetails> queryOrderDetailsById(int orderId);
}

@Mapper
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;

    public OrderDetails queryOrderDetailsById(int orderId){
        List<OrderDetails> list = orderMapper.queryOrderDetailsById(orderId);
        OrderDetails orderDetails = null;
        if(list.size() > 0){
            orderDetails = list.get(0);
        }
        return orderDetails;
    }
}

@Data
public class Order {
    private Integer id;
    private String orderNo;
    ...
}

@Data
public class OrderItem {
    private Integer id;
    private Integer orderId;
    private Integer goodsId;
    ...
}

@Data
public class Goods {
    private Integer id;
    private String goodsName;
    ...
}

@Data
public class OrderDetails {
    private Integer orderId;
    private String orderNo;
    ...
    private Integer goodsId;
    private String goodsName;
    ...
}

<select id="queryOrderDetailsById" resultMap="OrderDetailsMap">
    SELECT
        o.*,
        oi.*,
        g.*
    FROM
        tb_order as o
        LEFT JOIN tb_order_item as oi ON o.id = oi.order_id
        LEFT JOIN tb_goods as g ON oi.goods_id = g.id
    WHERE
        o.id = #{orderId}
</select>

<resultMap id="OrderDetailsMap" type="com.example.OrderDetails">
    <result property="orderId" column="id"/>
    <result property="orderNo" column="order_no"/>
    ...
    <result property="goodsId" column="id"/>
    <result property="goodsName" column="goods_name"/>
    ...
</resultMap>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java工程mybatis实现多表查询过程详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • tomcat自定义Web部署文件中docBase和workDir的区别介绍

    当我们将Web应用部署到Tomcat服务器上时,可以在Tomcat配置文件中自定义Web应用。在Tomcat配置文件中,有两个重要的属性:docBase和workDir。这两个属性在Tomcat上非常重要,因为它们决定了Web应用的部署位置和缓存位置。 docBase属性 docBase属性指定了Web应用的根目录。Tomcat会在docBase路径下查找W…

    Java 2023年6月15日
    00
  • SpringBoot项目实战之数据交互篇

    下面我会详细讲解“SpringBoot项目实战之数据交互篇”的完整攻略。 1. 结构说明 本篇文章主要介绍如何在SpringBoot项目中实现数据交互。具体包括三个方面:JDBC、Spring Data JPA、Mybatis。本文所使用的数据库是MySQL。 项目的结构如下: │ pom.xml │ ├─src │ └─main │ ├─java │ │ …

    Java 2023年5月20日
    00
  • Java hashCode() 方法详细解读

    Java hashCode() 方法详细解读 1. 什么是hashCode()方法 hashCode()方法是Java中Object类提供的一个方法,作用是返回一个对象的哈希值。哈希值是一个非负整数,它是根据对象的内部信息生成的,可以用于判断两个对象是否相等。 2. hashCode()方法的作用 在Java中,如果两个对象的哈希值不相等,那么它们一定不相等…

    Java 2023年5月26日
    00
  • Java自学书籍Top 10

    下面我详细介绍一下“Java自学书籍Top 10”的攻略: 一、为什么要学Java? 在介绍Java自学书籍的攻略之前,我们先来了解一下为什么要学Java。Java是目前使用比较广泛的编程语言之一,它具有以下特点: Java是一种跨平台的语言,可以在不同操作系统上运行。 Java具有比较好的可读性和易于维护性。 Java拥有庞大的用户群体和丰富的开源库,方便…

    Java 2023年5月23日
    00
  • springmvc 分页查询的简单实现示例代码

    下面是完整的“springmvc 分页查询的简单实现示例代码”的攻略: 1. 简介 Spring MVC 是一个基于 Java 的 Web 应用程序框架,而分页查询则是 Web 应用程序中常用的功能之一。本文将向您展示如何在 Spring MVC 中实现简单的分页查询功能。 2. 实现步骤 2.1 添加 jar 包 在项目的 pom.xml 中添加以下依赖:…

    Java 2023年6月15日
    00
  • 浅谈java中String的两种赋值方式的区别

    下面是详细的攻略: 标题 浅谈Java中String的两种赋值方式的区别 简介 在Java编程中,经常要用到字符串类型。字符串在Java中是一个非常重要的数据类型,工作中经常会使用到。对于String类型的赋值方式,有两种方式,分别是直接赋值和通过new关键字创建字符串对象进行赋值。这两种方式在使用时有一些区别,需要我们进行了解和掌握。 直接赋值 直接赋值是…

    Java 2023年5月27日
    00
  • cemtos 7 linux 安装与卸载 tomcat 7的教程

    CentOS 7 Linux安装Tomcat 7教程 步骤一:安装Java 在CentOS 7中,我们可以使用yum来安装Java。在命令行终端中运行以下命令来安装: sudo yum install java-1.8.0-openjdk-devel 该命令将在系统中安装OpenJDK 1.8。 步骤二:下载Tomcat 7 您可以从Tomcat官方网站 h…

    Java 2023年5月19日
    00
  • Java实现的傅里叶变化算法示例

    我很高兴为你讲解“Java实现的傅里叶变化算法示例”的完整攻略。下面是详细过程: 1. 傅里叶变换简介 傅里叶变换是数字信号处理中一种非常常见的算法。它可以将时域信号转换为频域信号,方便我们分析信号的频谱结构和特性。在实际应用中,傅里叶变换在图像处理、音频信号处理等领域有着广泛的应用。傅里叶变换可以表示为以下形式: $$X(k) = \sum_{n=0}^{…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部