前言
最近由于工作需要,要写个接口调用oracle数据库存储过程,于是尝试使用Springboot JPA 来实现这个功能。以下是自己编写的测试demo。
提示:以下是本篇文章正文内容,下面案例可供参考
一、准备
1.创建一个数据表
-- Create table
create table TEST_JPA
(
id NUMBER not null,
name VARCHAR2(300)
)
tablespace TBS_BSS_NHIS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column TEST_JPA.id
is 'id';
2.编写存储过程
简单定义一个过程:入参两个分别是ID 和NAME ,输出两个CODE和NOTE
CREATE OR REPLACE PROCEDURE TEST_JPA_PROCEDURES(O_CODE OUT NUMBER,
O_NOTE OUT VARCHAR2,
I_ID IN NUMBER, --ID
I_NAME IN VARCHAR2 --NAME
) AS
BEGIN
O_CODE := 1;
O_NOTE := '成功';
insert into TEST_JPA values(I_ID,I_NAME);
commit;
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK;
O_CODE := -1;
O_NOTE := '错误:' || SQLERRM;
RETURN;
END;
END TEST_JPA_PROCEDURES;
二、代码演示
1.定义Entity对象
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity(name = "TEST_JPA")
/**
* 调用数据库存储过程需要在实体类定义定义
* name: 在EntityManager中的名字 NamedStoredProcedureQuery使用
* procedureName: 数据库里存储过程的名字
* parameters: 使用IN/OUT参数
*
* 存储过程使用了注解@NamedStoredProcedureQuery 并绑定到一个JPA表。
* procedureName是存储过程的名字
* name是JPA中存储过程的名字
* 使用注解@StoredProcedureParameter来定义存储过程使用的IN/OU参书
*/
@NamedStoredProcedureQuery(name = "TEST_JPA_PROCEDURES",procedureName = "TEST_JPA_PROCEDURES",parameters = {
@StoredProcedureParameter(mode = ParameterMode.OUT,name = "O_CODE",type=Integer.class),
@StoredProcedureParameter(mode = ParameterMode.OUT,name="O_NOTE",type = String.class),
@StoredProcedureParameter(mode = ParameterMode.IN,name = "I_ID",type=Integer.class),
@StoredProcedureParameter(mode = ParameterMode.IN,name="I_NAME",type = String.class)
})
public class TestJpa {
@Id
@Column(name = "ID")
private long id;
@Column(name = "NAME")
private String name;
}
2.定义实现类
@Resource
private EntityManager entityManager;
@Override
public void testJpaProcedures() {
/**
* StoredProcedureQuery 创建存储过程仓库
* createStoredProcedureQuery(name) name 时过程名
* registerStoredProcedureParameter表示存储过程中注册的参数
* ParameterMode 参数
*/
StoredProcedureQuery storedProcedureQuery = this.entityManager.createNamedStoredProcedureQuery("TEST_JPA_PROCEDURES");
/**
* 注册定义过程的出参和入参
* 如果@NamedStoredProcedureQuery 定义了参数类型,这里就不需要再重复注册了
*/
// storedProcedureQuery.registerStoredProcedureParameter("O_CODE",Integer.class, ParameterMode.OUT);
// storedProcedureQuery.registerStoredProcedureParameter("O_NOTE",String.class, ParameterMode.OUT);
// storedProcedureQuery.registerStoredProcedureParameter("I_ID",Long.class, ParameterMode.IN);
// storedProcedureQuery.registerStoredProcedureParameter("I_NAME",String.class, ParameterMode.IN);
/**
* 设置传入参数值
*/
storedProcedureQuery.setParameter("I_ID",100)
.setParameter("I_NAME","测试JPA");
/**
* 执行
*/
storedProcedureQuery.execute();
/**
* 获取结果出参
*/
int code = (int) storedProcedureQuery.getOutputParameterValue("O_CODE");
String node = (String) storedProcedureQuery.getOutputParameterValue("O_NOTE");
logger.info("过程执行结果:code:{},node:{}",code,node);
}
3.测试类
@Resource
private ExtHandlerMapper extHandlerMapper;
@Test
public void test3(){
//测试
extHandlerMapper.testJpaProcedures();
}
总结
本文主要内容是介绍如何在springData Jpa中实现数据库存储过程的demo演示和配置。以上代码,是我在实际开发中编写的测试demo的部分代码。因为本人比较懒,不想整理代码,所以完整代码无法贴出来。如有兴趣,可以关注我后续更新!
参考:
https://www.cnblogs.com/joeyJss/p/11458653.html
https://www.cnblogs.com/kongxianghai/p/7575616.html