Простой способ вызвать хранимую процедуру в Java

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

напишите эту скучную обертку для нескольких процедур, это не проблема, но если есть сотни процедур, это действительно кошмар Есть ли более простой способ вызвать процедуру хранилища, чем этот способ? Редактирование: я думаю, что генератор кода, который использует параметры процедуры из БД, является способом elagant, но я ничего не понимаю в java

  • 0
    Другого пути нет.
  • 0
    Вы можете попробовать использовать упаковщик хранимых процедур Spring JDBC ( rockycode.com/blog/stored-procedure-spring-jdbc ), возможно, вам понравится больше
Показать ещё 3 комментария
Теги:
jdbc

4 ответа

2

Мне нравится использовать MyBatis структуру данных для таких проблем. Подробный пример работы с MyBatis и хранимыми процедурами можно найти на http://loianegroner.com/2011/03/ibatis-mybatis-working-with-stored-procedures/

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 и объявить переменные, но по крайней мере у вас теперь есть одна универсальная оболочка для обработки всех ваших вызовов.

  • 0
    Я действительно думал об этом, но представьте, что когда вы звоните на практике, выглядело так: HashMap<String, String> inMap = HashMap<String, String>(); HashMap<String, String> outMap = HashMap<String, String>(); inMap.put("VUSCD", uscd); inMap.put("VPWD", pwd); inMap.put("VPCSQ", pcsq); inMap.put("VHWID", hwid); Установка значения для inMap так же странна, как и обычно :(
  • 0
    @yelliver: Нет лучшего варианта на ум. Преимущество метода, который я предлагаю, состоит в том, что вам просто нужно объявить один сегмент кода, который обрабатывает все, вам просто нужно позаботиться о вызовах. Вы можете просто объявить два HashMaps и очистить их между вызовами, это может сделать код менее странным, но я думаю, что в какой-то момент вы все равно определите имена и значения параметров.
Показать ещё 1 комментарий
1

Нет другого пути. Да, это скучно, но количество процедур конечно. Эти процедуры похожи на методы на Java, поэтому вы должны работать с ними в установленных правилах. Только одна удобная вещь, которую вы могли бы сделать - создать специальный класс, который будет содержать обернутые методы для каждой процедуры. В этом случае будет более элегантно называть их в бизнес-коде, что-то вроде этого:

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

Но внутри этого метода вам нужно скопировать код, упомянутый выше.

  • 1
    Возможно, можно было бы даже автоматически сгенерировать этот класс-оболочку DAO с помощью скрипта.
  • 0
    @ Филипп, да, я согласен. Но это более сложный вопрос :)
Показать ещё 2 комментария
0

В клиенте базы данных хранимая процедура, такая как myproc (10,20), вызывается просто по инструкции выберите myproc (10,20);

Итак, в вашей программе JDBC вы можете просто сделать: connection = getConnection(); stmt = connection.createStatement(); stmt.executeQuery( "select myproc (10,20)" );

Если процедура возвращает что-то, то положите ее в ResultSet

  • 0
    и как вы будете обобщать эти аргументы? Избегайте SQL-инъекций ...
  • 0
    Это просто строка. Манипулируя строкой, можно получить процедуру, вызываемую с любыми аргументами, которые действительны, хотя ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню