计算机系统应用教程网站

网站首页 > 技术文章 正文

MyBatis如何调用一个存储过程? mybatis中调用存储过程

btikc 2024-11-08 10:52:25 技术文章 7 ℃ 0 评论

存储过程是什么?它是一组预先编辑好的SQL语句存储在MySQL数据库服务器中,可以被看做是一个单独执行的调用单元。一个存储过程允许开发者将一系列执行的SQL语句打包成一个整体的调用单元,然后在需要的时候执行这个调用单元来完成数据处理操作。存储过程通常情况下被用来执行一些复杂的数据处理业务,下面是一个数据存储过程的一般的结构,如下所示。

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

其中procedure_name是存储过程的名称,parameters是存储过程可以传入的参数。下面我们就来看看如何使用存储过程。

如何使用存储过程?

一个最经典的案例,就是Oracle中的员工薪水表employee,包括了员工的姓名和员工的薪水,然后我们创建一个存储过程,根据员工的姓名对其薪水进行增加或者减少,如下所示。

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的存储过程,并且接受了两个参数员工姓名和员工薪水的变动值。在这个存储过程中报了一个更新语句用来对员工薪水进行更新,这里我们通过传入的薪水的正负来控制薪水的增减。那么如何调用这个存储过程呢?

调用一个存储过程的操作如下,我们可以通过call关键字来进行调用。

CALL update_salary('John', 500.00);

上面这个操作表示将John用户的薪水增加500。

通过存储过程,我们可以在数据库业务中实现一些复杂逻辑的处理,可以减少对于重复代码的编写,同时通过存储过程我们可以实现数据操作的一致性。那么在MyBatis中如何调用一个存储过程呢?

MyBatis中如何调用一个存储过程?

在MyBatis中调用存储过程可以通过如下的方式来实现。还是以employee表为例来实现。

第一步、创建一个存储过程

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;

可以看到这里传入了三个参数分别是一个输入参数员工ID和两个输出参数姓名和薪水。

第二步、编写Mapper的调用接口

@Mapper
public interface EmployeeMapper {
    void getEmployeeInfo(@Param("employeeId") int employeeId, @Param("name") String name, @Param("salary") BigDecimal salary);
}

在这个方法中,我们传入了三个参数分别是员工ID、姓名和薪水。

第三步、编写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>

这里需要注意,在这个XML配置中,我们使用{call ...}语法来调用存储过程,并指定输入参数和输出参数。

第四步、测试调用

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();
        }
    }
}

在这个方法中,我们调用了get_employee_info存储过程传入了参数为1并器返回了员工的姓名和薪资。

以上就是一个简单的示例,演示了如何在MyBatis中调用存储过程。在实际项目中,您需要根据存储过程的参数和返回值进行适当的配置,并处理可能出现的异常情况。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表