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)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 {
}
关键要点:
存储过程使用了注释@NamedStoredProcedureQuery,并绑定到一个JPA表。
procedureName是存储过程的名字
name是JPA中的存储过程的名字
使用注释@StoredProcedureParameter来定义存储过程使用的IN/OUT参数
3、创建Spring Data JPA数据库
下面我们来创建Spring Data JPA数据库:
public interface MyTableRepository extends CrudRepository
@Procedure(name = "in_only_test")
void inOnlyTest(@Param("inParam1") String inParam1);
@Procedure(name = "in_and_out_test")
String inAndOutTest(@Param("inParam1") String inParam1);
}
关键要点:
@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);
5、其它技巧
如果上面的代码不工作,可以这么解决。定义自定义的Repository来调用存储过程昨晚本地查询。
定义自定义的Repository:
public interface MyTableRepositoryCustom {
void inOnlyTest(String inParam1);
}
然后要确保主Repository类继承了这个接口。
复制代码 代码如下:
public interface MyTableRepository extends CrudRepository
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();
}
}
可以以常规的方式进行调用:
@Autowired
MyTableRepository myTableRepository;
// 调用存储过程
myTableRepository.inOnlyTest(inParam1);
温馨提示:内容为网友见解,仅供参考
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(inPar...
Spring Data JPA 之 @Query 语法详解及其应用
Spring Data JPA中的@Query功能详解及其应用 通过添加@Query到一个方法中,我们可以直接使用JPQL(Java Persistence Query Language)进行数据库查询,如在UserRepository中:测试代码显示,不再依赖方法名生成查询,而是由@Query注解中的内容决定查询语句:“From User where name=:name”。深入理解其工作原理...
spring data jpa param注解怎么注入参数
需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包)。mybatis-spring-1.0.0.jar(与Spring结合包)。MyBatis简介MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis只使用简单的XML和注解来配置和映射基本数据类型、Ma...
springboot开发使用mybatis还是springdatajpa??
尽管从功能角度看,这两者在一定程度上是互补的。Spring Data JPA支持原生SQL和存储过程,而Mybatis也具备部分ORM特性,最终选择取决于开发和维护效率。在频繁修改表结构的开发阶段,Mybatis可能不如Spring Data JPA或Hibernate的反向工程高效。考虑与Spring全家桶的兼容性,我们团队最终选择了Spring Data JPA。
JAVA入门教程什么好?
JPA。ORM框架的出现使得我们能够以面向对象的方式来操作关系数据库,但是长久以来实现应用系统中的数据访问层依然是一件非常繁琐的事情,简单的查询也往往涉及大量重复代码。Spring Data JPA在则基于JPA进一步简化了数据访问层的实现,它提供了一种类似于声明式编程的方式,开发者只需要编写数据访问接口(称为Repository),Sprin...
Java学习路线是怎样的?
第七阶段,互联网框架的高级应用1:分布式服务框架的理解,Dubbo架构设计详解及其核心要点,框架运行原理分析、SpringData数据访问、Lucene搜索引擎、Lucene的全文搜索服务器介绍、索引建立方式、Solr海量数据搜索引擎、Socket网络通信、实现RMI远程对象通讯、使用JMS消息服务、Kafka分布式消息系统、WebService与Restful...
java持久化框架有哪些
2. MyBatis框架 解释:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。它允许开发者直接使用原生SQL,同时提供了映射器来管理数据库操作。由于操作简单、灵活性强,MyBatis也受到了广大开发者的喜爱。3. JPA 解释:...
java后端主流框架?
第一个,SpringMVC。 SpringMVC是一种基于Java地实现了WebMVC设计模式仔没的请求驱动类型的轻量级Web框架,主要是帮助我们简化日常的Web开发; 第二个,Mybatis。 MyBatis是支持普通SQL查询,存储过程和高级帆告映射的优秀持久层框架; 第三个,Spring。 Spring深得企业的青睐; 第四个,Maven。 越来越多的开发人员开始使用...
编程中的代码能看懂。。但是让自己写却写不出来。应该怎么办? 要有...
第一阶段:学习java首先是得安装配置jdk 下面开始我们愉快且掉头发的java之旅 1、入门的基本礼仪:HelloWord 2、Java基础语法 3、Java条件结构 4、Java循环结构 第二阶段:数组:数组作为java里面的第一个可以存储数据的容器,也是后面集合的基础 第三阶段:面向对象:万物皆可对象,这也是java的核心思想...
Java基础的书有哪些比较好的?
◆ 讲解了Servlet、JSP、WebSockets、Spring Framework、AMQP、JPA和O\/RM、Spring Data、全文搜索、Apache Lucene和Hibernate Search、Spring Security和OAuth ◆ 重点介绍Java SE 8中新增加的常用功能,如lambda表达式和新的JSR 310 Java 8 Date and Time API等 6、高性能MySQL 《高性能mysql(第3版)》是mysql 领域...