调用存储过程时,我使用以下代码:
connection = getConnection();
stmt = connection.prepareCall("{call MPLOGIN (?, ?, ?, ?, ?, ?)}");
stmt.setString("VUSCD", uscd);
stmt.setString("VPWD", pwd);
stmt.setString("VPCSQ", pcsq);
stmt.setString("VHWID", hwid);
stmt.registerOutParameter("VLOGID", OracleTypes.VARCHAR);
stmt.registerOutParameter("VKQ", OracleTypes.VARCHAR);
stmt.execute();
String vlogid = stmt.getString("VLOGID");
String vkq = stmt.getString("VKQ");
写这个无聊的包装器几个程序没有问题,但如果有数百个程序,那真的是一场噩梦
有没有比这种方式调用存储过程更简单的方法?
编辑:我认为使用来自数据库的过程参数的代码生成器是一种很好的方式,但我在java中没有谷歌
答案 0 :(得分:2)
你可以,也许创建一个通用的包装器,沿着这些方向:
public Map<String, String> SPWrapper(String call, Map<String, String> inParams, Map<String, OracleTypes> outParams)
{
connection = getConnection();
try
{
stmt = connection.prepareCall(call);
for(String inParam : inParams.keys())
{
stmt.setString(inParam, inParams.get(inParam));
}
for(String outParam : outParams.keys())
{
stmt.registerOutParameter(outParam, outParams.get(outParam));
}
stmt.execute();
Map<String,String> results = new HashMap<String, String>();
for(String outParam : outParams.keys())
{
results.put(outParam, stmt.getString(outParam));
}
return results;
}
catch (Exception e)
{
//LOG Exception
return new HashMap<String, String>();
}
finally
{
connection.close(); //Do not leave connections open.
}
}
你仍然需要传递call
并声明变量,但至少你现在有一个通用的包装器来处理所有的调用。
答案 1 :(得分:2)
我喜欢使用MyBatis数据映射器框架来解决此类问题。可以在http://loianegroner.com/2011/03/ibatis-mybatis-working-with-stored-procedures/
找到使用MyBatis和存储过程的广泛示例答案 2 :(得分:1)
没有任何其他方式。是的,这很无聊,但程序数量是有限的。这个过程就像Java中的方法一样,所以你应该按规定的规则操作它们。 你只能做一件方便的事 - 创建特殊的类,它将包含每个过程的包装方法。在这种情况下,在业务代码中调用它们会更优雅,如下所示:
String[] result = DAO.MPLOGIN(uscd, pwd, pcsq, hwid);
但是在这种方法中你必须复制上面提到的代码。
答案 3 :(得分:0)
在数据库客户端中,只通过语句调用存储过程(如myproc(10,20)) 选择myproc(10,20);
因此,在您的JDBC程序中,您可以这样做: connection = getConnection(); stmt = connection.createStatement(); stmt.executeQuery(“select myproc(10,20)”);
如果过程返回了某些内容,则将其放入ResultSet