在Java中调用存储过程的简便方法

时间:2013-01-11 09:43:50

标签: java oracle jdbc

调用存储过程时,我使用以下代码:

    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中没有谷歌

4 个答案:

答案 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