我一直在使用 Spring JDBC 的 SimpleJdbcCall。我觉得很有帮助,但对我来说仍然不够简单和巧妙。理想情况下,我认为 JDBC 调用与普通 Java 方法调用没有区别。
看到Java最近出现了很多轻量级的ORM框架(如Ebean),想问问在存储过程方向上有没有类似的发展?
最佳答案
使用 JPA 2.1
通过 JDBC 或 JPA 从 Java 调用存储过程可能非常乏味和冗长。如果你看examples provided by EclipseLink ,使用 JPA 2.1,事情并没有变得那么简单:
@NamedStoredProcedureQuery(
name="ReadUsingMultipleResultSetMappings",
procedureName="Read_Multiple_Result_Sets",
resultSetMappings = {
"EmployeeResultSetMapping",
"AddressResultSetMapping",
"ProjectResultSetMapping",
"EmployeeConstructorResultSetMapping"
}
)
@SqlResultSetMappings({
@SqlResultSetMapping(
name = "EmployeeResultSetMapping",
entities = {
@EntityResult(entityClass = Employee.class)
}
),
@SqlResultSetMapping(
name = "EmployeeConstructorResultSetMapping",
classes = {
@ConstructorResult(
targetClass = EmployeeDetails.class,
columns = {
@ColumnResult(name="EMP_ID", type=Integer.class),
@ColumnResult(name="F_NAME", type=String.class),
@ColumnResult(name="L_NAME", type=String.class),
@ColumnResult(name="R_COUNT", type=Integer.class)
}
)
}
)
})
使用jOOQ
一个不错的选择是利用代码生成器,例如 jOOQ 的代码生成器(我为 jOOQ 供应商工作,所以这个答案有偏见)。假设这个过程:
-- Check whether there is an author in AUTHOR by that name and get his ID
CREATE OR REPLACE PROCEDURE author_exists (
author_name VARCHAR2,
result OUT NUMBER,
id OUT NUMBER
);
使用生成的代码,您可以简单地这样调用它:
AuthorExists result = Routines.authorExists(configuration, "Paulo");
assertEquals(new BigDecimal("1"), result.getResult());
assertEquals(new BigDecimal("2"), result.getId();
有关详细信息,另请参阅 jOOQ 手册:
- > http://www.jooq.org/doc/latest/manual/sql-execution/stored-procedures/
- > http://www.jooq.org/doc/latest/manual/sql-execution/stored-procedures/oracle-member-procedures/
使用其他代码生成器
存在其他代码生成器,可以用来生成乏味的 JDBC 或 JPA 代码。
关于java - 从 Java 调用存储过程 - Spring JDBC 的现代替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797425/