提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
SpringBoot使用存储过程
前言
存储过程(Stored Procedure)是一种在数据库中存储的、可被多次调用的预编译程序单元。它是一组SQL语句的集合,可以在数据库中执行一系列操作。存储过程通常由数据库管理系统的特定编程语言编写,例如,对于Oracle数据库,存储过程通常是用PL/SQL(Procedural Language/Structured Query Language)编写的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、特点
封装性: 存储过程将一系列SQL语句封装在一个单独的单元中,使其成为一个独立的、可复用的程序。
可重用性: 存储过程可以被多次调用,促使了代码的重用。这有助于减少代码的冗余,并简化了数据库操作的管理。
参数传递: 存储过程可以接受输入参数,使得可以根据不同的参数值执行不同的操作。这增加了存储过程的灵活性和通用性。
性能优化: 存储过程的代码在首次编译后被存储在数据库中,因此每次调用时无需重新编译。这可以提高性能,特别是当存储过程包含复杂的业务逻辑时。
事务控制: 存储过程可以包含事务控制语句,用于确保一系列操作的原子性,即要么全部成功执行,要么全部回滚。
安全性: 存储过程的执行权限可以被分配给不同的用户,以控制对数据库的访问。
提示:用存储过程时,通常通过调用存储过程的名称和传递参数的方式来执行它
二、存储过程的创建和使用
1.存储过程定义
基本结构代码如下(示例):
//存储过程的开始 CREATE PROCEDURE语句用于定义新的存储过程,OR REPLACE表示如果同名的存储过程已经存在,则替换它。
CREATE OR REPLACE PROCEDURE add_numbers
//num1 、num1 等是参数的名称,而NUMBER是参数的数据类型。存储过程可以接受零个或多个输入参数。
(num1 NUMBER, num2 NUMBER, sum OUT NUMBER)
//IS 变量的声明 这里暂未使用
IS
//这是存储过程主体的开始标记(写sql和逻辑)。
BEGIN
sum := num1 + num2;//自定义sql
//异常捕捉
EXCEPTION
WHEN OTHERS THEN
-- 步骤 5: 处理其他异常
-- 在此处理任何未捕获的异常
DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
//结束标记,其中procedure_name是存储过程的名称
END add_numbers;
/
2.使用例子
2.1 创建表
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50),
salary NUMBER
);
-- 插入数据
INSERT INTO employees VALUES (1, 'John', 'Doe', 50000);
INSERT INTO employees VALUES (2, 'Jane', 'Smith', 60000);
COMMIT;
2.2 创建存储过程
-- 创建存储过程 这里是一个简单的查询功能
CREATE OR REPLACE PROCEDURE get_employee_info
(p_employee_id IN NUMBER,
p_first_name OUT VARCHAR2,
p_last_name OUT VARCHAR2,
p_salary OUT NUMBER)
AS
BEGIN
SELECT first_name, last_name, salary
INTO p_first_name, p_last_name, p_salary //INTO 语句通常用于将查询的结果赋值给存储过程中声明的变量。
FROM employees
WHERE employee_id = p_employee_id;
END get_employee_info;
2.3 SpringBoot方式调用(实体类等省略)
.yml配置文件(安装自己配置修改)
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
mybatis.mapper-locations=classpath:mapper/*.xml
mapper接口
@Mapper
public interface EmployeeMapper {
void callGetEmployeeInfo(
@Param("p_employee_id") int employeeId,
@Param("p_first_name") Map<String, Object> firstName,
@Param("p_last_name") Map<String, Object> lastName,
@Param("p_salary") Map<String, Object> salary
);
mybatis的xml文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.EmployeeMapper">
<resultMap id="callGetEmployeeInfoResultMap" type="java.util.Map">
<result column="p_first_name" property="first_name" />
<result column="p_last_name" property="last_name" />
<result column="p_salary" property="salary" />
</resultMap>
<select id="callGetEmployeeInfo" resultMap="callGetEmployeeInfoResultMap">
{call get_employee_info(
#{p_employee_id, mode=IN, jdbcType=INTEGER},
#{p_first_name, mode=OUT, jdbcType=VARCHAR},
#{p_last_name, mode=OUT, jdbcType=VARCHAR},
#{p_salary, mode=OUT, jdbcType=INTEGER}
)}
</select>
</mapper>
Service接口
@Service
public class EmployeeService {
@Autowired
private EmployeeMapper employeeMapper;
public Map<String, Object> getEmployeeInfo(int employeeId) {
Map<String, Object> result = new HashMap<>();
employeeMapper.callGetEmployeeInfo(employeeId, result, result, result);
return result;
}
}
Controller类
@RestController
@RequestMapping("/api/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/{employeeId}")
public Map<String, Object> getEmployeeInfo(@PathVariable int employeeId) {
return employeeService.getEmployeeInfo(employeeId);
}
测试
启动您的 Spring Boot 应用程序,然后使用浏览器或其他工具访问 http://localhost:8080/api/employees/1(替换为您的实际端口和路径)