最近一周,我有机会开发了一个Spring Boot微服务,从三个数据源中获取数据,这三个数据源都是以存储过程的形式暴露的。
Spring Data JPA提供了一组方便的注解来处理存储过程。我想如果我分享如何优雅而干净地完成它,而不陷入常见的陷阱,可能会对其他开发人员有所帮助。
我在本文中整理了要遵循的步骤。在本文中,我使用了AWS MariaDB实例进行示例。
- 使用以下SQL创建表并填充数据。
- 使用MySQL Workbench创建名为“get_all_employees”的存储过程。
i. 右键单击“Routines”,选择“Create Procedure…”菜单项。
在MySQL Workbench上创建存储过程
ii. 创建存储过程逻辑内容。
将选择所有查询作为存储过程逻辑
iii. 将SQL脚本应用到数据库中。
iv. 在bench中调用存储过程进行测试。
测试存储过程。
-
数据库方面已经准备好了。现在开始编写代码。使用https://start.spring.io/创建一个Spring Boot项目,并添加spring-boot-starter-data-jpa和spring-boot-starter-web依赖项(你可以在pom.xml中找到),创建常规的spring包结构,包括控制器、域和存储库。
-
如下所示创建域对象Employees。
上述类中需要注意的关键点如下。
@NamedStoredProcedureQueries
注解为你执行魔法,它是调用存储过程的工具。
@NamedStoredProcedureQuery(name = "getAllEmployees",
procedureName = "get_all_employees",
resultClasses = Employees.class)
@NamedStoredProcedureQuery通过“procedureName”属性指向存储过程。
“name”属性创建应用程序范围的命名存储过程查询的引用。你可以使用此来调用存储过程。“resultClasses”属性是保存结果的bean。
- 下一个棘手的部分是如何使用JPA存储库调用此NamedStoredProcedureQuery。Spring文档建议使用@Procedure注释来调用它。
@Procedure(name = "getAllEmployees")
List<Employees> getAllEmployees();
当我尝试使用@Procedure注释时,我遇到了各种错误。进一步阅读问题导致我通过通常的JPA存储库另一种方式使用NamedStoredProcedure。
创建自定义存储库接口
public interface EmployeeRepositoryCustom {
List<Employees> getAllEmployees();
}
创建扩展CrudRepository<>和EmployeeRepositoryCustom的存储库。这将允许你拥有所有CrudRepositoy功能,并通过自定义存储库进行扩展。
public interface EmployeeRepository extends CrudRepository<Employees, Long>, EmployeeRepositoryCustom {
}
最后,创建扩展EmployeeRepositoryCustom的EmployeeRepositoryImpl。
请注意使用@PersistenceContext注入entityManager以按给定名称(getAllEmployees)访问NamedStoredProcedure。
public class EmployeeRepositoryImpl implements EmployeeRepositoryCustom {
@PersistenceContext
private EntityManager em;
@Override
public List<Employees> getAllEmployees() {
StoredProcedureQuery findByYearProcedure =
em.createNamedStoredProcedureQuery("getAllEmployees");
return findByYearProcedure.getResultList();
}
}
现在你可以像往常一样将EmployeeRepository注入到服务层中。
希望这对其他开发人员有所帮助。: )。完整的源代码可在GitHub上找到。
译自:https://kalpads.medium.com/calling-stored-procedure-using-spring-jpa-ee37fa58ca2d
评论(0)