3

ストアド プロシージャを呼び出すときは、次のコードを使用します。

    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");

いくつかのプロシージャに対してこの退屈なラッパーを書くことは問題ではありませんが、何百ものプロシージャがある場合、それは本当に悪夢です この方法よりも簡単にストア プロシージャを呼び出す方法はありますか? 編集:DBからのプロシージャのパラメーターを使用するコードジェネレーターはエレガントな方法だと思いますが、Javaで何も検索しません

4

4 に答える 4

2

このような問題には、 MyBatisデータ マッパー フレームワークを使用するのが好きです。MyBatis とストアド プロシージャを使用した広範な例は、http://loianegroner.com/2011/03/ibatis-mybatis-working-with-stored-procedures/にあります。

于 2013-01-11T10:44:02.257 に答える
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 つあります。

于 2013-01-11T09:51:58.393 に答える
1

他に方法はありません。はい、退屈ですが、手順の数は有限です。この手続きは Java のメソッドのようなものなので、決められたルールに従って操作する必要があります。できる便利なことは 1 つだけです。各プロシージャのラップされたメソッドを含む特別なクラスを作成することです。この場合、次のようにビジネス コードで呼び出す方がエレガントです。

String[] result = DAO.MPLOGIN(uscd, pwd, pcsq, hwid);

ただし、このメソッド内では、上記のコードをコピーする必要があります。

于 2013-01-11T09:51:06.480 に答える
0

データベース クライアントでは、myproc(10,20) などのストアド プロシージャは select myproc(10,20); ステートメントによって呼び出されます。

したがって、JDBC プログラムでは次のようにできます。stmt = connection.createStatement(); stmt.executeQuery("select myproc(10,20)");

プロシージャが何かを返す場合は、それを ResultSet に入れます

于 2013-01-11T10:30:40.937 に答える