jpa mysql存储过程_Spring Data JPA调用存储过程实例代码实例

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Data JPASpring Data项目中的一个模块,它基于JPA(Java Persistence API)规范,提供了一种简化的方式来操作数据库。使用Spring Data JPA,开发人员可以通过定义接口的方式来实现常见的数据库操作,例如插入、查询、更新和删除等。同时,Spring Data JPA还为开发人员提供了一些便捷的特性,例如动态查询、分页、排序等。 在使用Spring Data JPA时,需要先定义一个实体类,并使用JPA注解来映射数据库表结构。例如,下面是一个简单的实体类定义: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; // getters and setters } ``` 接下来,需要定义一个继承自JpaRepository的接口,来完成数据库操作。例如,下面是一个定义了常见操作的接口: ``` public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); List<User> findByAgeGreaterThan(Integer age); List<User> findByNameLike(String name); } ``` 在使用该接口时,只需要注入该接口的实例即可。例如,下面是一个简单的示例,展示了如何使用该接口进行数据库操作: ``` @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> findByName(String name) { return userRepository.findByName(name); } public List<User> findByAgeGreaterThan(Integer age) { return userRepository.findByAgeGreaterThan(age); } public List<User> findByNameLike(String name) { return userRepository.findByNameLike("%" + name + "%"); } } ``` 在使用MySQL数据库时,需要在项目的配置文件中配置数据源和JPA相关的配置。例如,下面是一个示例的application.yml配置文件: ``` spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true hibernate: ddl-auto: update properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect ``` 其中,`spring.datasource.url`需要根据实际情况修改为对应的MySQL数据库地址和端口;`spring.datasource.username`和`spring.datasource.password`需要修改为对应的数据库用户名和密码。另外,`spring.jpa.show-sql`设置为true时,会在控制台输出JPA执行的SQL语句,方便调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值