Springboot2.x Jpa ——调用数据库存储过程,得到出参结果


前言

最近由于工作需要,要写个接口调用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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值