java - 从 Java 调用存储过程 - Spring JDBC 的现代替代品?

标签 java stored-procedures jdbc

我一直在使用 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 手册:

使用其他代码生成器

存在其他代码生成器,可以用来生成乏味的 JDBC 或 JPA 代码。

关于java - 从 Java 调用存储过程 - Spring JDBC 的现代替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797425/

相关文章:

mysql - ID 的字符串分割并与 MySQL 中的名称连接

java - Spring Data Neo4j 图形存储库不工作

java - 从部分 XML 向 TableLayout 添加更多行

java - 使用 Java 中的 BigDecimal(或其他类)获得更高的精度

sql - "Select Top 10, then Join Tables",而不是 "Select Top 10 from Joined Tables"

.net - Entity Framework 存储过程和 POCO

java - 如何使用 Resultset 更新 JDBC 中的值

java - JDBC/结果集错误

java - 设置来自 Java 的 PostgreSQL JDBC 连接的连接选项

java - 使用可重入锁中断所有等待线程 Java