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日

相关文章

  • SpringSecurity定义多个过滤器链的操作代码

    要定义多个过滤器链,需要使用Spring Security提供的WebSecurityConfigurerAdapter类,该类可以用于配置Spring Security的安全性过滤器链。 以下是定义多个过滤器链的完整攻略: 创建一个类继承WebSecurityConfigurerAdapter类,并覆盖configure(HttpSecurity http…

    Java 2023年5月20日
    00
  • IDEA Maven Mybatis generator 自动生成代码(实例讲解)

    下面是详细讲解“IDEA Maven Mybatis generator 自动生成代码(实例讲解)”的完整攻略。 简介 Maven Mybatis generator 是一种可以帮助开发者自动生成 Mybatis 相关代码的工具。它可以根据数据库表的结构,自动生成实体类、Mapper 接口以及 XML Mapper 文件,大大提高了代码编写的效率。 本攻略将…

    Java 2023年5月19日
    00
  • Java随手笔记8之包、环境变量和访问控制及maven profile实现多环境打包

    Java随手笔记8之包、环境变量和访问控制及maven profile实现多环境打包 包 在Java中,包是用来管理和组织类的,可以避免类名重复和冲突。包名是由完整类名组成的,例如com.example.myapp。约定俗成的做法是让包名和域名一致。 如何定义包 在Java源代码的开头,使用package关键字来定义包,例如: package com.exa…

    Java 2023年5月19日
    00
  • SpringBoot整合Sharding-JDBC实现MySQL8读写分离

    下面我将详细讲解如何使用SpringBoot整合Sharding-JDBC实现MySQL8读写分离的过程,包括环境搭建、配置文件编写、代码实现和示例说明等: 一、环境搭建 使用MySQL8搭建读写分离环境并创建两个数据库:sharding_db_0和sharding_db_1,分别对应写库和读库。 在maven中引入Sharding-JDBC和相关依赖: x…

    Java 2023年6月16日
    00
  • JDBC以反射机制加载类注册驱动连接MySQL

    JDBC以反射机制加载类注册驱动连接MySQL的攻略如下: 导入相关的JDBC驱动jar包。假设我们使用MySQL数据库,需要下载并导入mysql-connector-java.jar包。如果不清楚如何导入jar包,可以自行查阅相关教程。 使用反射机制动态加载类。JDBC4.0以后的版本,不需要显式地调用Class.forName()方法加载驱动程序,但是我…

    Java 2023年6月16日
    00
  • 结合Service层讲解DAO层的异常处理操作

    让我详细讲解一下“结合Service层讲解DAO层的异常处理操作”的攻略。 首先,我们需要理解DAO(Data Access Object)层的作用。DAO层的主要任务是实现数据的持久化操作,负责与数据库交互,为上层提供数据访问接口。在实现DAO层的过程中,异常处理也是至关重要的一部分。 DAO层的异常处理分为两种情况: SQL异常 SQL异常是指在数据库操…

    Java 2023年5月27日
    00
  • IDEA的下载和使用安装详细图文教程

    IDEA的下载和安装 下载 前往IntelliJ IDEA官网(https://www.jetbrains.com/idea/),下载适合自己操作系统的版本。 安装 双击安装包,选择语言后点击”Next”。 选择安装路径,如果不设置,则默认在Program Files(x86)路径下创建一个JetBrains的文件夹。 可以选择创建桌面图标以及启动菜单等选项…

    Java 2023年6月15日
    00
  • Java实现一个顺序表的完整代码

    要实现一个顺序表,首先需要定义一个数据结构,用于存储数据,并提供相应的操作方法。以下是一个Java实现顺序表的完整代码的攻略。 定义数据结构 定义一个类ArrayList作为顺序表的数据结构。这个类具有以下属性和方法: size:表示顺序表的元素个数。 capacity:表示顺序表的最大容量。 elements:表示顺序表的存储空间,即一个数组。 Array…

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