Spring Boot整合MyBatis調(diào)用存儲過程的實現(xiàn)
前言
存儲過程是一組通過預(yù)先編譯好的SQL語句,存儲在數(shù)據(jù)庫服務(wù)器中,被視作是可以執(zhí)行的單個調(diào)用的執(zhí)行單元,它允許將一系列SQL語句打包成一個邏輯單元,這樣可以在需要的時候直接來調(diào)用這個邏輯單元來實現(xiàn)相關(guān)的操作。在一個存儲過程中可以包括常用的復(fù)雜數(shù)據(jù)處理、業(yè)務(wù)邏輯操作等。
下面我們就來看看如何在Spring Boot中整合MyBatis調(diào)用存儲過程實現(xiàn)。
存儲過程的結(jié)構(gòu)
CREATE PROCEDURE procedure_name(parameters)
BEGIN
-- SQL statements
END;其中,參數(shù)說明情況如下。
- procedure_name:存儲過程的名稱。
- parameters:存儲過程的參數(shù)(可選)。
拿一個最經(jīng)典的場景,來進(jìn)行說明,例如有一個表格employees,包含員工的姓名和薪水。我們想要創(chuàng)建一個存儲過程,根據(jù)員工的姓名增加或減少其薪水??梢酝ㄟ^如下的存儲過程來實現(xiàn)。
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 ;上面我們創(chuàng)建了一個名為update_salary的存儲過程,并且這個存儲過程接受了兩個參數(shù),員工的姓名(emp_name)和薪水變動的數(shù)值(salary_change)。
整個的存儲過程包含了一個SQL語句,這個SQL語句就是用來更新員工薪水的SQL語句。要調(diào)用存儲過程,可以使用 CALL 關(guān)鍵字來執(zhí)行調(diào)用,如下所示。
CALL update_salary('John Doe', 500.00);這個操作就會為 "John Doe" 的員工的薪水500美元。
使用MyBatis 調(diào)用存儲過程?
假設(shè)我們定義了一個存儲過程,用來獲取員工信息,并且其會接收一個員工ID的參數(shù)作為傳入的參數(shù),并且會返回該員工的姓名和薪水,如下所示。
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的接口用來調(diào)用這個存儲過程。如下所示。
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>調(diào)用存儲過程的代碼實現(xiàn)
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中調(diào)用存儲過程的整個操作,啟動代碼我們就可以看到ID為1的用戶的姓名以及薪水信息。
總結(jié)
總結(jié)一下,在實際操作的過程中,我們當(dāng)然不會這么使用,在真實的調(diào)用場景中可能會結(jié)合Controller、Service等處理邏輯來將這個存儲過程更好的利用起來,當(dāng)然了對于參數(shù)的配置、異常的處理在配置的時候一定要注意。很多人無法調(diào)用存儲過程都是因為參數(shù)沒有傳對,所以在實際操作的時候一定要注意相關(guān)的操作。
到此這篇關(guān)于Spring Boot整合MyBatis調(diào)用存儲過程的實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring Boot整合MyBatis調(diào)用存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot + Mybatis Plus 整合 Redis的詳細(xì)步驟
- 全網(wǎng)最新springboot整合mybatis-plus的過程
- SpringBoot3整合Mybatis完整版實例
- SpringBoot3快速整合MyBatisPlus的示例代碼
- Springboot整合mybatis-plus使用pageHelper進(jìn)行分頁(使用步驟)
- SpringBoot整合MybatisPlus的基本應(yīng)用詳解
- MyBatis中調(diào)用存儲過程和函數(shù)的實現(xiàn)示例
- MyBatis如何調(diào)用存儲過程
- MybatisPlus中如何調(diào)用Oracle存儲過程
相關(guān)文章
Dubbo在Spring和Spring Boot中的使用詳解
這篇文章主要介紹了Dubbo在Spring和Spring Boot中的使用詳解,需要的朋友可以參考下2017-10-10
windows下使用 intellij idea 編譯 kafka 源碼環(huán)境
這篇文章主要介紹了使用 intellij idea 編譯 kafka 源碼的環(huán)境,本文是基于windows下做的項目演示,需要的朋友可以參考下2021-10-10
以Java代碼的方式總結(jié)幾個典型的內(nèi)存溢出案例
作為程序員,多多少少都會遇到一些內(nèi)存溢出的場景,如果你還沒遇到,說明你工作的年限可能比較短,或者你根本就是個假程序員!哈哈,開個玩笑.今天分享給大家Java內(nèi)存溢出的相關(guān)案例,希望大家在日常工作中,盡量避免寫這些low水平的代碼,需要的朋友可以參考下2021-06-06
java 中函數(shù)的參數(shù)傳遞詳細(xì)介紹
這篇文章主要介紹了 java 中函數(shù)的參數(shù)傳遞詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-11-11
Java?中很好用的數(shù)據(jù)結(jié)構(gòu)(你絕對沒用過)
今天跟大家介紹的就是?java.util.EnumMap,也是?java.util?包下面的一個集合類,同樣的也有對應(yīng)的的?java.util.EnumSet,對java數(shù)據(jù)結(jié)構(gòu)相關(guān)知識感興趣的朋友一起看看吧2022-05-05

