如何在Spring Boot中导入并使用Oracle数据库包(含调用示例)
在Spring Boot中调用Oracle数据库包的实现方法
一、针对cus.sMB_PACKAGE.EABAL的具体实现
1. 先配置Oracle数据库连接
确保Spring Boot的application.properties(或yaml)里填对Oracle数据源信息:
spring.datasource.url=jdbc:oracle:thin:@//你的Oracle地址:端口/服务名 spring.datasource.username=你的账号 spring.datasource.password=你的密码 spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
2. 两种调用方式任选
方式一:用JdbcTemplate(轻量直接)
直接通过JdbcTemplate调用包方法,注意Oracle的调用语法:
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import java.sql.Date; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @Component public class SmbPackageService { private final JdbcTemplate jdbcTemplate; // 构造注入JdbcTemplate public SmbPackageService(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void invokeEabal(Long newAseid, String inputDate) { // 把原SQL里的日期计算逻辑移到Java层处理,避免SQL拼接风险 LocalDate targetDate = LocalDate.parse(inputDate, DateTimeFormatter.ofPattern("dd-MM-yyyy")).minusDays(1); Date sqlDate = Date.valueOf(targetDate); // 构造Oracle包方法调用语句 String sql = "{ call cus.sMB_PACKAGE.EABAL(?, ?) }"; jdbcTemplate.update(sql, newAseid, sqlDate); } }
如果非要在SQL里处理日期,也可以这么写SQL:
"{ call cus.sMB_PACKAGE.EABAL(?, to_date(?,'dd-mm-yyyy') - 1) }"
调用时直接传入newAseid和原始日期字符串就行。
方式二:用MyBatis(适合复杂场景)
如果项目用MyBatis,直接在Mapper里定义调用方法即可:
- Mapper接口:
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; public interface SmbPackageMapper { @Update("{ call cus.sMB_PACKAGE.EABAL(#{newAseid}, to_date(#{dateStr},'dd-mm-yyyy') - 1) }") void callEabal(@Param("newAseid") Long newAseid, @Param("dateStr") String dateStr); }
或者用XML映射文件(适合更复杂的参数/结果映射):
<mapper namespace="com.your.project.mapper.SmbPackageMapper"> <update id="callEabal"> { call cus.sMB_PACKAGE.EABAL(#{newAseid}, to_date(#{dateStr},'dd-mm-yyyy') - 1) } </update> </mapper>
之后在Service里注入Mapper调用就行。
二、Spring应用调用Oracle数据库包的通用方法
1. 核心逻辑
Oracle的包方法(存储过程/函数)就是数据库端的可执行代码,Spring通过JDBC或ORM框架发送PL/SQL调用语句,语法规则:
- 调用无返回值的存储过程:
{ call 模式名.包名.方法名(参数列表) } - 调用有返回值的函数:
{ ? = call 模式名.包名.方法名(参数列表) }
2. 通用步骤
步骤1:配置依赖与数据源
Spring Boot项目先加依赖:<!-- Maven依赖 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <scope>runtime</scope> </dependency> <!-- 用JdbcTemplate加这个,用MyBatis就加spring-boot-starter-mybatis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>然后配置好前面提到的Oracle数据源。
步骤2:选择调用方式
- JdbcTemplate:适合简单场景,轻量无额外配置。
- 无返回值用
jdbcTemplate.update(),有返回值用jdbcTemplate.queryForObject(),涉及输出参数的话要注册参数类型:public String callPackageFunction(Long input) { String sql = "{ ? = call cus.sMB_PACKAGE.GET_RESULT(?) }"; return jdbcTemplate.queryForObject(sql, new Object[]{input}, new int[]{Types.VARCHAR, Types.NUMERIC}, String.class); }
- 无返回值用
- MyBatis:适合复杂参数/结果映射,比如涉及Oracle自定义对象、集合的场景,通过注解或XML配置更灵活。
- JPA/Hibernate:如果项目用JPA,可以用
@NamedStoredProcedureQuery映射包方法,但配置相对繁琐,适合已有JPA体系的项目。
- JdbcTemplate:适合简单场景,轻量无额外配置。
步骤3:参数处理注意点
- 日期参数:优先在Java层处理为
java.sql.Date或LocalDate后传入,避免SQL拼接;非要在SQL里转换的话,注意格式匹配。 - 输出参数:JdbcTemplate需要用
SqlOutParameter注册,MyBatis可以直接在参数里指定mode=OUT。 - 自定义类型:比如Oracle的OBJECT、TABLE,JdbcTemplate要写自定义
SqlTypeValue,MyBatis可以自定义TypeHandler处理。
- 日期参数:优先在Java层处理为
内容的提问来源于stack exchange,提问作者Samith Pathirana
相关产品推荐
相关产品推荐

