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

yizhihongxing

关于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日

相关文章

  • Java实现5种限流算法及7种限流方式

    Java实现5种限流算法及7种限流方式攻略 本文将介绍5种限流算法以及7种限流方式在Java中的实现,其中限流算法包括令牌桶、漏桶、计数器、滑动窗口和基于Hystrix的断路器。限流方式包括拦截器、过滤器、注解、配置、缓存、队列和断路器。 1.令牌桶 算法原理 令牌桶算法基于生产令牌和消费令牌的方式控制流量。生产令牌的速率是固定的,而当请求到达时,每个请求消…

    Java 2023年5月19日
    00
  • java实现批量导入Excel表格数据到数据库

    下面是“Java实现批量导入Excel表格数据到数据库”的完整攻略: 1. 准备工作 在Java中实现批量导入Excel数据到数据库,需要先进行以下准备工作: 导入相关依赖库 配置数据库连接 创建表格对应的实体类 1.1 导入相关依赖库 需要导入以下几个依赖库: <dependencies> <dependency> <grou…

    Java 2023年5月20日
    00
  • java如何使用Lombok更优雅地编码

    Java开发中,有很多操作都是重复而无聊的,例如get/set方法的编写。通过使用Lombok,可以在编码时更加优雅,省去这些重复的部分。下面是Java如何使用Lombok更优雅地编码的完整攻略: 1. 安装Lombok 首先在Maven中,添加Lombok的依赖: <dependency> <groupId>org.projectl…

    Java 2023年5月20日
    00
  • bootstrap weebox 支持ajax的模态弹出框

    Bootstrap是一套UI框架,其中Weebox是一个基于Bootstrap的模态弹出框插件,支持AJAX加载内容。本攻略将详细介绍如何使用Bootstrap Weebox插件实现AJAX加载内容的模态弹出框。 准备工作 引入Bootstrap和jQuery库。 <link rel="stylesheet" href="…

    Java 2023年6月16日
    00
  • Java 多线程传值的四种方法

    Java 多线程传值的四种方法 在Java中,当多个线程需要共享数据时,传值成为一件非常重要的事情。该文章将介绍Java中多线程传值的四种方法。 方法一:使用静态变量 Java中的静态变量在不同的线程之间是共享的,我们可以通过修改静态变量实现线程之间的值的传递。 public class ThreadDemo1 { private static int va…

    Java 2023年5月19日
    00
  • java实现的日期时间转换工具类完整示例

    下面我将详细讲解“Java实现的日期时间转换工具类完整示例”的完整攻略。 引言 在实际开发中,经常需要进行日期时间的转换和处理,比如将字符串表示的时间转换为Date对象,将Date对象格式化为字符串,计算日期时间差等等。为了方便我们进行这些操作,可以使用Java中的日期时间工具类库。下面,我们将详细介绍如何使用Java实现日期时间转换工具类。 简介 Java…

    Java 2023年5月20日
    00
  • java 字符串相减(很简单的一个方法)

    Java中的字符串是不可修改的,也就是说,字符串变量一旦被创建,它的值就不能改变。因此,不能像数字那样直接相减。但是,可以使用一种简单的方法来实现字符串相减的效果。 具体来说,可以将一个字符串中的另一个字符串删除,实现字符串相减的效果。下面给出两个示例说明: 示例一: String str1 = "hello world"; String…

    Java 2023年5月26日
    00
  • java中fastjson生成和解析json数据(序列化和反序列化数据)

    Java 中 FastJson 是一款高效的 JSON 解析库,可以将 Java 对象转换为 JSON 对象,同时也可以将 JSON 对象转换为 Java 对象,从而方便在 Java 应用程序中进行 JSON 数据的序列化(将 Java 对象转换为 JSON对象)和反序列化(将 JSON 对象转换为 Java 对象)。 下面我们通过两个示例具体说明 Fast…

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