Spring Boot整合MyBatis调用存储过程的实现

 更新时间:2026年03月13日 11:06:37   作者:程序员西西  
本文介绍了如何在SpringBoot中整合MyBatis调用存储过程实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

前言

存储过程是一组通过预先编译好的SQL语句,存储在数据库服务器中,被视作是可以执行的单个调用的执行单元,它允许将一系列SQL语句打包成一个逻辑单元,这样可以在需要的时候直接来调用这个逻辑单元来实现相关的操作。在一个存储过程中可以包括常用的复杂数据处理、业务逻辑操作等。

下面我们就来看看如何在Spring Boot中整合MyBatis调用存储过程实现。

存储过程的结构

CREATE PROCEDURE procedure_name(parameters)
BEGIN
    -- SQL statements
END;

其中,参数说明情况如下。

  • procedure_name:存储过程的名称。
  • parameters:存储过程的参数(可选)。

拿一个最经典的场景,来进行说明,例如有一个表格employees,包含员工的姓名和薪水。我们想要创建一个存储过程,根据员工的姓名增加或减少其薪水。可以通过如下的存储过程来实现。

DELIMITER //
    CREATE PROCEDURE update_salary(IN emp_name VARCHAR(50), IN salary_change DECIMAL(10, 2))
    BEGIN
        UPDATE employees
        SET salary = salary + salary_change
        WHERE name = emp_name;
    END //
DELIMITER ;

上面我们创建了一个名为update_salary的存储过程,并且这个存储过程接受了两个参数,员工的姓名(emp_name)和薪水变动的数值(salary_change)。

整个的存储过程包含了一个SQL语句,这个SQL语句就是用来更新员工薪水的SQL语句。要调用存储过程,可以使用 CALL 关键字来执行调用,如下所示。

CALL update_salary('John Doe', 500.00);

这个操作就会为 "John Doe" 的员工的薪水500美元。

使用MyBatis 调用存储过程?

假设我们定义了一个存储过程,用来获取员工信息,并且其会接收一个员工ID的参数作为传入的参数,并且会返回该员工的姓名和薪水,如下所示。

CREATE PROCEDURE get_employee_info(
    IN employeeId INT,
    OUT name VARCHAR(50),
    OUT salary DECIMAL(10, 2)
)
BEGIN
    SELECT name, salary INTO name, salary
    FROM employees
    WHERE id = employeeId;
END;

接下来我们就需要定义一个Mapper的接口用来调用这个存储过程。如下所示。

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
@Mapper
public interface EmployeeMapper {
    void getEmployeeInfo(@Param("employeeId") int employeeId, @Param("name") String name, @Param("salary") BigDecimal salary);
}

接口定义好之后接下来需要做的事情就是编写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.example.mapper.EmployeeMapper">
    <select id="getEmployeeInfo" statementType="CALLABLE">
        {call get_employee_info(#{employeeId, mode=IN, jdbcType=INTEGER}, #{name, mode=OUT, jdbcType=VARCHAR}, #{salary, mode=OUT, jdbcType=DECIMAL})}
    </select>
</mapper>

调用存储过程的代码实现

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
public class Main {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        try (InputStream inputStream = Resources.getResourceAsStream(resource)) {
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
                EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
                int employeeId = 1;
                String name = null;
                BigDecimal salary = null;
                employeeMapper.getEmployeeInfo(employeeId, name, salary);
                System.out.println("Name: " + name);
                System.out.println("Salary: " + salary);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这样我们就完成了在MyBatis中调用存储过程的整个操作,启动代码我们就可以看到ID为1的用户的姓名以及薪水信息。

总结

总结一下,在实际操作的过程中,我们当然不会这么使用,在真实的调用场景中可能会结合Controller、Service等处理逻辑来将这个存储过程更好的利用起来,当然了对于参数的配置、异常的处理在配置的时候一定要注意。很多人无法调用存储过程都是因为参数没有传对,所以在实际操作的时候一定要注意相关的操作。

到此这篇关于Spring Boot整合MyBatis调用存储过程的实现的文章就介绍到这了,更多相关Spring Boot整合MyBatis调用存储过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的自动装箱与自动拆箱的实现

    Java中的自动装箱与自动拆箱的实现

    自动装箱和自动拆箱使得我们在使用基本数据类型时更加方便,同时也提高了代码的可读性和健壮性,本文将详细介绍Java中的自动装箱和自动拆箱机制,感兴趣的可以了解一下
    2023-08-08
  • SpringBoot整合Mybatis-plus关键词模糊查询结果为空

    SpringBoot整合Mybatis-plus关键词模糊查询结果为空

    SpringBoot整合Mybatis-plus使用关键词模糊查询的时候,数据库中有数据,但是无法查找出来,本文就来介绍一下SpringBoot整合Mybatis-plus关键词模糊查询结果为空的解决方法
    2025-04-04
  • SpringBoot整合之SpringBoot整合MongoDB的详细步骤

    SpringBoot整合之SpringBoot整合MongoDB的详细步骤

    这篇文章主要介绍了SpringBoot整合之SpringBoot整合MongoDB的详细步骤,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 解决BeanUtils.copyProperties之大坑

    解决BeanUtils.copyProperties之大坑

    这篇文章主要介绍了解决BeanUtils.copyProperties之大坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring创建Bean的过程Debug的详细流程

    Spring创建Bean的过程Debug的详细流程

    这篇文章主要介绍了Spring创建Bean的过程Debug的流程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • java ArrayBlockingQueue阻塞队列的实现示例

    java ArrayBlockingQueue阻塞队列的实现示例

    ArrayBlockingQueue是一个基于数组实现的阻塞队列,本文就来介绍一下java ArrayBlockingQueue阻塞队列的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • springboot访问后端静态资源404问题

    springboot访问后端静态资源404问题

    文章主要介绍了在Spring Boot中访问后台静态资源时可能出现的404错误及解决方法,并解释了MyBatis中驼峰命名转下划线的默认行为以及如何使用@Id和@GeneratedValue注解来标识主键属性
    2024-12-12
  • Java实现任务超时处理方法

    Java实现任务超时处理方法

    任务超时处理是比较常见的需求,Java中对超时任务的处理有两种方式,在文中给大家详细介绍,本文重点给大家介绍Java实现任务超时处理方法,需要的朋友可以参考下
    2019-06-06
  • MyBatis 引入映射器的方法

    MyBatis 引入映射器的方法

    本文通过实例代码给大家分享mybatis 引入映射器的方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • 使用SpringBoot开发Restful服务实现增删改查功能

    使用SpringBoot开发Restful服务实现增删改查功能

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。这篇文章主要介绍了基于SpringBoot开发一个Restful服务,实现增删改查功能,需要的朋友可以参考下
    2018-01-01

最新评论