首页
Preview

使用Spring JPA调用存储过程

最近一周,我有机会开发了一个Spring Boot微服务,从三个数据源中获取数据,这三个数据源都是以存储过程的形式暴露的。

Spring Data JPA提供了一组方便的注解来处理存储过程。我想如果我分享如何优雅而干净地完成它,而不陷入常见的陷阱,可能会对其他开发人员有所帮助。

我在本文中整理了要遵循的步骤。在本文中,我使用了AWS MariaDB实例进行示例。

  1. 使用以下SQL创建表并填充数据。
  1. 使用MySQL Workbench创建名为“get_all_employees”的存储过程。

i. 右键单击“Routines”,选择“Create Procedure…”菜单项。

在MySQL Workbench上创建存储过程

ii. 创建存储过程逻辑内容。

将选择所有查询作为存储过程逻辑

iii. 将SQL脚本应用到数据库中。

iv. 在bench中调用存储过程进行测试。

测试存储过程。

  1. 数据库方面已经准备好了。现在开始编写代码。使用https://start.spring.io/创建一个Spring Boot项目,并添加spring-boot-starter-data-jpa和spring-boot-starter-web依赖项(你可以在pom.xml中找到),创建常规的spring包结构,包括控制器、域和存储库。

  2. 如下所示创建域对象Employees。

上述类中需要注意的关键点如下。

@NamedStoredProcedureQueries

注解为你执行魔法,它是调用存储过程的工具。

@NamedStoredProcedureQuery(name = "getAllEmployees",
                            procedureName = "get_all_employees",
resultClasses = Employees.class)

@NamedStoredProcedureQuery通过“procedureName”属性指向存储过程。

“name”属性创建应用程序范围的命名存储过程查询的引用。你可以使用此来调用存储过程。“resultClasses”属性是保存结果的bean。

  1. 下一个棘手的部分是如何使用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

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
阿波
The minute I see you, I want your clothes gone!

评论(0)

添加评论