Spring Data JPA调用存储过程实例https://blog.csdn.net/chszs/article/details/50127823Spring Data JPA调用存储过程实例
作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs
JPA连接到数据库,调用存储过程,这样的需求很常见。本文就针对这一点,讲述如何使用Spring Data JPA调用存储过程的方法。
1、存储过程
假设存储过程如下:
CREATE OR REPLACE PACKAGE test_pkg AS
   PROCEDURE in_only_test (inParam1 IN VARCHAR2);
   PROCEDURE in_and_out_test (inParam1 IN VARCHAR2, outParam1 OUT VARCHAR2);
END test_pkg;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
   PROCEDURE in_only_test(inParam1 IN VARCHAR2) AS
   BEGIN
      DBMS_OUTPUT.PUT_LINE('in_only_test');
   END in_only_test;
   PROCEDURE in_and_out_test(inParam1 IN VARCHAR2, outParam1 OUT VARCHAR2) AS
   BEGIN
      outParam1 := 'Woohoo Im an outparam, and this is my inparam ' || inParam1;
   END in_and_out_test;
END test_pkg;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
这里有两个存储过程:
1)in_only_test
它需要一个输入参数inParam1,但不返回值
2)in_and_out_test
它需要一个输入参数inParam1,且返回值outParam1
2、@NamedStoredProcedureQueries
我们可以使用@NamedStoredProcedureQueries注释来调用存储过程。
@Entity
@Table(name = "MYTABLE")
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "in_only_test", procedureName = "test_pkg.in_only_test", parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam1", type = String.class) }),
        @NamedStoredProcedureQuery(name = "in_and_out_test", procedureName = "test_pkg.in_and_out_test", parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam1", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.OUT, name = "outParam1", type = String.class) }) })
public class MyTable implements Serializable {
}
1
2
3
4
5
6
7
8
9
10
关键要点:
存储过程使用了注释@NamedStoredProcedureQuery,并绑定到一个JPA表。
procedureName是存储过程的名字
name是JPA中的存储过程的名字
使用注释@StoredProcedureParameter来定义存储过程使用的IN/OUT参数
3、创建Spring Data JPA数据库
下面我们来创建Spring Data JPA数据库:
public interface MyTableRepository extends CrudRepository<MyTable, Long> {
    @Procedure(name = "in_only_test")
    void inOnlyTest(@Param("inParam1") String inParam1);

@Procedure(name = "in_and_out_test")
    String inAndOutTest(@Param("inParam1") String inParam1);
}
1
2
3
4
5
6
7
关键要点:
@Procedure的name参数必须匹配@NamedStoredProcedureQuery的name
@Param必须匹配@StoredProcedureParameter注释的name参数
返回类型必须匹配:in_only_test存储过程返回是void,in_and_out_test存储过程必须返回String
4、调用
我们可以这样调用存储过程:
    // 向存储过程传递参数并返回值
    String inParam = "Hi Im an inputParam";
    String outParam = myTableRepository.inAndOutTest(inParam);
    Assert.assertEquals(outParam, "Woohoo Im an outparam, and this is my inparam Hi Im an inputParam");
    // 向存储过程传递参数不返回值
    myTableRepository.inOnlyTest(inParam);
1
2
3
4
5
6
5、其它技巧
如果上面的代码不工作,可以这么解决。定义自定义的Repository来调用存储过程昨晚本地查询。
定义自定义的Repository:
public interface MyTableRepositoryCustom {
    void inOnlyTest(String inParam1);
}
1
2
3
然后要确保主Repository类继承了这个接口。
public interface MyTableRepository extends CrudRepository<MyTable, Long>, MyTableRepositoryCustom {
}
1
2
6、创建Repository实现类
接着该创建Repository实现类了:
public class MyTableRepositoryImpl implements MyTableRepositoryCustom {
@PersistenceContext
private EntityManager em;
@Override
public void inOnlyTest(String inParam1) {
    this.em.createNativeQuery("BEGIN in_only_test(:inParam1); END;").setParameter("inParam1", inParam1)
            .executeUpdate();
}
1
2
3
4
5
}
可以以常规的方式进行调用:
@Autowired
MyTableRepository myTableRepository;
// 调用存储过程
myTableRepository.inOnlyTest(inParam1);
1
2
3
4
是不是很简单。https://img-blog.csdnimg.cn/20190217105710569.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwNzgxNDE=,size_16,color_FFFFFF,t_70《算法导论 第三版英文版》_高清中文版.pdf
https://pan.baidu.com/s/17D1kXU6dLdU0YwHM2cvNMw
《深度学习入门:基于Python的理论与实现》_高清中文版.pdf
https://pan.baidu.com/s/1IeVs35f3gX5r6eAdiRQw4A
《深入浅出数据分析》_高清中文版.pdf
https://pan.baidu.com/s/1GV-QNbtmjZqumDkk8s7z5w
《Python编程:从入门到实践》_高清中文版.pdf
https://pan.baidu.com/s/1GUNSg4mdpeOf1LC_MjXunQ
《Python科学计算》_高清中文版.pdf
https://pan.baidu.com/s/1-hDKhK-7rDDFll_UFpKmpw

SpringDataJPA调用存储过程实例相关推荐

  1. mysql存储过程 php_PHP调用MYSQL存储过程实例

    说一下 在PHP页面中调用MYSQL存储过程的方法 以下是几个例子 仅供参考 实例一:无参的存储过程 $conn = mysql_connect('localhost','root','root') ...

  2. server使用abp中调用存储过程 sql_ASP调用sql server 存储过程详解-附带实例-

    ado文档对使用指定属性创建新的 Parameter 对象. 语法 Set parameter = command.CreateParameter (Name, Type, Direction, Si ...

  3. pgsql的存储过程调用mysql_PostgreSQL中调用存储过程并返回数据集实例

    这里用一个实例来演示PostgreSQL存储过程如何返回数据集. 1.首先准备数据表 //member_category create table member_category(id serial, ...

  4. Mybatis 调用SqlServer 和 Oracle的存储过程实例

    1.创建好mybatis的Mapper文件 在接口文件中声明好接口以及返回的参数类型 Map<String, Object> getGoodsInfo(Map<String,Obje ...

  5. 水晶报表调用存储过程的问题

    前言:现在碰到了水晶报表调用存储过程的问题,问题是这样的:ERP软件里有很多的数据表,有些报表的字段要从多个数据表里取数据,并且要对数据进行处理,来作为报表的字段,我看了些资料,说可以通过存储过程来取 ...

  6. mysql jdbc 创建存储过程_mysql JDBC 调用存储过程

    与oracle不同,mysql不支持匿名块,如果需要写过程语句,则必需定义存储过程.如果你会oracle的存储过程,那么mysql的存储过程也很简单了. 一.创建存储过程 create procedu ...

  7. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  8. 7、使用CallableStatement接口调用存储过程

    第一节:CallableStatement 接口的引入 CallableStatement 主要是调用数据库中的存储过程,CallableStatement 也是 Statement 接口的子接口.在 ...

  9. SQL存储过程实例具体解释

    SQL存储过程实例具体解释 本文用3个题目,从建立数据库到创建存储过程,具体解说数据库的功能. 题目1 学校图书馆借书信息管理系统建立三个表: 学生信息表:student 字段名称 数据类型 说明 s ...

  10. 通过hibernate去调用存储过程

    为了在 Hibernate 中使用存储过程,你必须遵循一些规则.不遵循这些规则的存储过程将不可用.如果你仍然想使用他们,你必须通过 session.connection() 来执行他们.这些规则针对于 ...

最新文章

  1. 30岁暂别职场、40岁提前退休:不上班的生活,开心吗?
  2. php和python区别-php与python的区别
  3. 【干货】迅雷产品经理:浅析用户成长体系
  4. 歪枣网股票数据下载接口汇总一
  5. PHP如何判断提交表单中多个复选框是否选中?
  6. 类似clover的软件_Clover 我的电脑里的书签栏
  7. python 小技巧之获取固定下面包含的某种类型文件的个数
  8. 7个示例科普CPU CACHE(zz)
  9. 解决ubuntu10.04不能上网
  10. 190411每日一句
  11. AMPL-最短路选择问题
  12. 自己动手编译android ffmpeg
  13. 关于alfa无线设备
  14. 如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?
  15. 5步完成编写Mysql的shell脚本
  16. 安装域、对域进行管理
  17. Java开发常用词汇表
  18. php图片素描化,ps怎么把图片变成素描图片
  19. 水晶报表制作6*4cm的打印纸标签,预览时数据是一页,打印出来却多了一页空白?
  20. 入侵网站的黑客被我抓到了!

热门文章

  1. 实现透明背景但背景上元素不透明
  2. 大年三十整理的asp.net资料!(不得不收藏)
  3. mysql授权账号查询权限_【MySQL】MySQL授权与用户权限查询
  4. excel表用office2007一保存就闪退
  5. java 代码走查_Java代码走查具体考察点
  6. ICCV 2021可逆的跨空间映射实现多样化的图像风格传输:Diverse Image Style Transfer via Invertible Cross-Space Mapping
  7. 软件工程 -- 开发模型
  8. 使用hMailServer邮箱服务器收发邮件
  9. 深入理解计算机系统李秋豪,《深入理解计算机系统》第7章:重定位PC相对引用的理解...
  10. mac下加速下载百度云资源