我是dropwizard的新手。我正在通过不同的教程,但我找不到关于如何使用JDBI调用dropwizard中的存储过程的好示例/教程。
答案 0 :(得分:3)
使用JDBI,可以将对象SQL查询指定为方法注释。 DB将此字符串视为普通SQL。执行存储过程的示例DAO可能如下所示:
public interface SomeQueries
{
@SqlQuery("call find_name_procedure(:id)")
String findName(@Bind("id") int id);
}
先前已定义find_name_procedure
。
有关详细信息,请参阅http://jdbi.org/sql_object_api_queries/
答案 1 :(得分:1)
Jooq是一种从java调用存储过程的优雅方法(参见https://dzone.com/articles/using-stored-procedures-with-jpa-jdbc-meh-just-use)。你还有一个第三方模块将Jooq集成到Dropwizard中 (见http://modules.dropwizard.io/thirdparty/) 因此,如果您熟悉Maven,您可以快速设置组合并开始验证它是否适用于您的情况。
答案 2 :(得分:1)
DropWizard JDBI提供了两个进行存储过程调用的选项。取决于你想要的存储过程。
如果你想要Stored Proc的结果集,Andy已经回答了这个问题:
public interface DAO
{
@SqlQuery("call sp_name(:id)")
String query(@Bind("id") int id);
}
另一种情况是你的存储过程没有返回结果集但是会给出一些输出参数。您可以这样做:
@SqlCall("{ CALL sp_name(:id, :id2) }")
@OutParameter(name = "out", sqlType = Types.INTEGER)
OutParameters spCal(@Bind("id") long id, @Bind("id2") long id2);
OutParameter注释可能无法在DropWizard中使用,因为注释是在v3中引入的,您可以使用以下内容来访问OutParameters:
try (Handle handle = dbi.open()) {
parameters = handle.createCall("CALL sp_name(:IN_Field1,:OUT_field2)")
.bind("IN_Field1", filed1)
.registerOutParameter("OUT_field2", Types.INTEGER)
.invoke();
}
对于一些真正的怪异情况,你需要Outparameters和resultset - DropWizard目前还没有提供任何直接方式(因为带有dropwizard的JDBI版本是旧的)。所以,您可以通过以下方式获得连接:
handle = jdbi.open()
handle.getConnection()
然后做你想做的连接。
另外,还有一件事 - 我不会尝试使用Hibernate进行Stored Proc调用。它更加痛苦。
答案 3 :(得分:0)
我使用Zalando Sprocwrapper。我喜欢它,并在Zalando公司广泛用于调用PostgreSQL函数。