从Java调用存储过程 – Spring 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手册:

> 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代码.

点赞