当前位置: 首页 > article >正文

MyBatis 实现批量查询操作:以苍穹外卖套餐菜品关联查询为例

一、引言

在开发数据库应用时,我们常常会遇到需要进行批量操作的场景。比如在一个餐饮系统中,菜品和套餐之间存在多对多的关系,通常会有一个中间表 setmeal_dish 来记录套餐和菜品的关联信息。当我们需要根据多个菜品 ID 查询对应的套餐 ID 时,就涉及到批量查询的需求。MyBatis 作为一款优秀的持久层框架,提供了强大而灵活的方式来实现这类批量操作,下面我们就结合具体的代码示例来详细分析。

二、代码示例展示

2.1 SQL 映射文件(XML 方式)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.SetmealDishMapper">

    <select id="getSetmealIdsByDishIds" resultType="java.lang.Long">
        select setmeal_id from setmeal_dish where dish_id in
        <foreach collection="dishIds" item="dishId" separator="," open="(" close=")">
            #{dishId}
        </foreach>
    </select>
</mapper>

2.2 Mapper 接口

package com.sky.mapper;

import com.sky.entity.SetmealDish;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface SetmealDishMapper {
    /**
     * 根据菜品id查询对应的套餐id
     *
     * @param dishIds
     * @return
     */
    //select setmeal_id from setmeal_dish where dish_id in (1,2,3,4)
    List<Long> getSetmealIdsByDishIds(List<Long> dishIds);
}

三、代码详细解析

3.1 Mapper 接口

在 SetmealDishMapper 接口中,我们定义了一个方法 getSetmealIdsByDishIds,它接收一个 List<Long> 类型的参数 dishIds,表示多个菜品的 ID。该方法的返回值是一个 List<Long> 类型,即查询到的对应的套餐 ID 列表。@Mapper 注解表明这是一个 MyBatis 的 Mapper 接口,MyBatis 会自动为其生成代理实现类。

3.2 SQL 映射文件

在 SQL 映射文件中,<mapper> 标签的 namespace 属性指定了该映射文件对应的 Mapper 接口的全限定名,这里是 com.sky.mapper.SetmealDishMapper

<select> 标签定义了一个查询操作,id 属性对应 Mapper 接口中的方法名 getSetmealIdsByDishIdsresultType 属性指定了查询结果的类型为 java.lang.Long,表示查询结果是一个 Long 类型的集合。

重点在于 <foreach> 标签,它是实现批量查询的关键:

  • collection 属性:指定要遍历的集合,这里是传入的 dishIds 列表。
  • item 属性:指定集合中每个元素的别名,在 #{} 中可以使用该别名引用元素的值,这里是 dishId
  • separator 属性:指定元素之间的分隔符,这里使用逗号 ,
  • open 和 close 属性:分别指定遍历结果的起始和结束符号,这里使用括号 ( 和 )

通过 <foreach> 标签,MyBatis 会将传入的 dishIds 列表展开,生成类似 select setmeal_id from setmeal_dish where dish_id in (1, 2, 3, ...) 的 SQL 语句,从而实现根据多个菜品 ID 进行批量查询对应的套餐 ID。

四、使用示例

以下是一个简单的使用示例,展示如何调用 getSetmealIdsByDishIds 方法:

import com.sky.mapper.SetmealDishMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
public class SetmealDishService {

    @Autowired
    private SetmealDishMapper setmealDishMapper;

    public List<Long> getSetmealIdsByDishIdsExample() {
        List<Long> dishIds = Arrays.asList(1L, 2L, 3L);
        return setmealDishMapper.getSetmealIdsByDishIds(dishIds);
    }
}

在这个示例中,我们创建了一个包含三个菜品 ID 的列表,然后调用 setmealDishMapper.getSetmealIdsByDishIds 方法进行批量查询,最终会返回对应的套餐 ID 列表。

五、总结

通过使用 MyBatis 的 <foreach> 标签,我们可以方便地实现批量查询操作,避免了多次执行单条查询语句带来的性能开销。这种方式不仅提高了代码的简洁性和可维护性,还能有效地提升数据库操作的效率。在实际开发中,我们可以根据具体的业务需求,灵活运用 <foreach> 标签的各种属性,实现不同类型的批量操作,如批量插入、批量更新等。希望本文能帮助你更好地理解和掌握 MyBatis 中的批量操作技巧。


http://www.kler.cn/a/553576.html

相关文章:

  • 斐波那契数列模型:在动态规划的丝绸之路上追寻斐波那契的足迹(上)
  • 教学资料档案管理系统
  • Navicat Premium17 连接Oracle出现 “未加载 Oracle库
  • rnn.pad_sequence测试
  • 游戏引擎学习第110天
  • 在Vue项目中使用three.js在前端页面展示PLY文件或STL文件
  • 【Docker】《一文深度解析Docker核心技术:镜像、存储卷与网络架构原理》
  • itemgetter() 是 Python operator 模块中的一个函数,主要用于从 字典、列表、元组等数据结构中取值
  • Redis_基础
  • Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300的秘密武器
  • ubuntu22.04安装tigervnc使用vnc进行访问
  • 《Python在数据可视化中的应用与实践》
  • 【黑马点评优化】2-Canel实现多级缓存(Redis+Caffeine)同步
  • 负载均衡 方式
  • 【Elasticsearch】搜索时分片路由
  • Go入门之函数
  • 高并发系统架构设计全链路指南
  • 自制AirTag,支持安卓/鸿蒙/PC/Home Assistant,无需拥有iPhone
  • 应用程序中的网络协议:原理、应用与挑战
  • Java 大视界 -- 企业数字化转型中的 Java 大数据战略与实践(93)