在Java企业级应用开发中,数据持久化是一个核心环节,而Java Persistence API(JPA)提供了一种标准化的方式来管理Java对象的持久化。JPA不仅支持对象关系映射(ORM),还支持调用数据库存储过程。本文将通过一个实例,详细探讨如何使用JPA的StoredProcedureQuery
接口来调用数据库存储过程,并演示如何在HSQLDB数据库中实现这一功能。
创建数据库函数
首先,我们需要在HSQLDB数据库中创建一个简单的存储过程,用于计算两个整数的和。我们将这个过程命名为getSum
,它接受两个整数参数a
和b
,并返回它们的和。
CREATE FUNCTION getSum(a INT, b INT)
RETURNS INT
RETURN a + b;
配置持久化环境
接下来,我们需要在persistence.xml
文件中配置持久化单元,以便JPA能够管理我们的实体和存储过程调用。在这个配置文件中,我们指定了JPA的版本、数据库提供者、数据库连接信息以及用于创建数据库模式的脚本。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="example-unit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:dataSource"/>
<property name="javax.persistence.sql-load-script-source" value="function.sql" />
<property name="hibernate.hbm2ddl.import_files_sql_extractor"
value="org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor" />
</properties>
</persistence-unit>
</persistence>
调用存储过程
现在,我们可以通过JPA的StoredProcedureQuery
接口来调用我们刚刚创建的getSum
存储过程。以下是一个简单的Java类,它演示了如何执行这一操作。
public class ExampleMain {
private static EntityManagerFactory entityManagerFactory =
Persistence.createEntityManagerFactory("example-unit");
public static void main(String[] args) {
try {
getSum(3, 6);
} finally {
entityManagerFactory.close();
}
}
private static void getSum(int a, int b) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
StoredProcedureQuery procedureQuery = entityManager
.createStoredProcedureQuery("getSum");
procedureQuery.registerStoredProcedureParameter("a", Integer.class, ParameterMode.IN);
procedureQuery.registerStoredProcedureParameter("b", Integer.class, ParameterMode.IN);
procedureQuery.setParameter("a", a);
procedureQuery.setParameter("b", b);
procedureQuery.execute();
Object singleResult = procedureQuery.getSingleResult();
System.out.println("sum: " + singleResult);
}
}
输出结果
执行上述代码后,控制台将输出:
sum: 9
项目依赖和技术栈
- hsqldb 2.4.1: HSQLDB - 轻量级的100% Java SQL数据库引擎。
- hibernate-core 5.3.6.Final: Hibernate的核心ORM功能。实现
javax.persistence:javax.persistence-api
版本2.2。 - JDK 1.8
- Maven 3.5.4
通过本文的介绍,您应该能够理解如何在Java应用中使用JPA调用数据库存储过程,以及如何配置和使用StoredProcedureQuery
。这为处理复杂的数据库操作提供了一种强大而灵活的方法。