Вызов хранимой процедуры Firebird из сервлета Java

У меня есть база данных Firebird с некоторой хранимой процедурой, и я разрабатываю приложение для Интернета / базы данных Java. Я хочу знать, возможно ли это и как вызывать эти хранимые процедуры из класса Java или сервлета.

пример:

  1. Хранимая процедура deletep, используемая для удаления строки из базы данных
  2. мой webapp Jsp / сервлеты
  3. Я хочу создать ссылку, которая выполняет мою хранимую процедуру удаления

person Moh Lamine    schedule 24.03.2018    source источник


Ответы (2)


Выполнить хранимую процедуру Firebird на Java можно несколькими способами. Метод JDBC по умолчанию будет выглядеть примерно так:

try (CallableStatement cstmt = connection.prepareStatement(
        "{call yourProcedure(?, ?, ?)}")) {
    cstmt.setString(1, "value1");
    cstmt.setString(2, "value2");
    cstmt.setString(3, "value3");
    cstmt.execute();
}

Если бы хранимую процедуру Firebird можно было выбрать (то есть: содержит SUSPEND и может возвращать несколько строк), вам нужно будет сделать что-то вроде:

try (CallableStatement cstmt = connection.prepareStatement(
        "{call yourProcedure(?, ?, ?)}")) {
    cstmt.setString(1, "value1");
    cstmt.setString(2, "value2");
    cstmt.setString(3, "value3");
    try (ResultSet rs = cstmt.executeQuery()) {
        while(rs.next()) {
            // do something with result set rows ...
        }
    }
}

Этого достаточно, если хранимая процедура является исполняемой и не возвращает никаких значений. Если хранимая процедура является исполняемой с (несколькими) возвращаемыми столбцами, вам потребуется что-то вроде:

try (CallableStatement cstmt = connection.prepareStatement(
        "{call yourProcedure(?, ?, ?, ?, ?)}")) {
    cstmt.setString(1, "value1");
    cstmt.setString(2, "value2");
    cstmt.setString(3, "value3");
    cstmt.registerOutParameter(4, Types.VARCHAR);
    cstmt.registerOutParameter(5, Types.VARCHAR)
    cstmt.execute();

    String out1 = cstmt.getString(4);
    String out2 = cstmt.getString(5);
    // do something with result
}

В качестве альтернативы вы можете использовать специальный синтаксис Firebird EXECUTE PROCEDURE yourProcedure(?, ?, ?) для исполняемых хранимых процедур и SELECT * FROM yourProcedure(?, ?, ?).

person Mark Rotteveel    schedule 25.03.2018

Это возможно с помощью Jaybird, драйвера Firebird JDBC.

Три шага:

  1. Создайте java-класс DBUtil для хранения запроса:

    public static void deletePlan(Connection conn, CallableStatement 
            statement, String code, String rev, String mention) throws SQLException {  
    
        statement.setString(1, code);
        statement.setString(2, rev);
        statement.setString(3, mention);
        statement.execute();
    }
    
  2. Создайте сервлет удаления

    protected void doGet(HttpServletRequest request, 
            HttpServletResponse response) throws ServletException, IOException {
        Connection conn = MyUtils.getStoredConnection(request);
    
        String code = request.getParameter("code");
        String rev = request.getParameter("revision");
        String mention = request.getParameter("mention");
        CallableStatement statement = null;
        try {
            statement = conn.prepareCall("execute procedure 
        DELETEP(?,?,?)");
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    
        String errorString = null;
    
        try {
            DBUtils.deletePlan(conn, statement, code, rev, mention);
        } catch (SQLException e) {
            e.printStackTrace();
            errorString = e.getMessage();
        } 
        .........
    
  3. Создайте ссылку для удаления в файле jsp

    <a href="${pageContext.request.contextPath}/deletePlan code=${plan.code}&revision=${plan.revision}&mention=${plan.mention}">Delete</a>
    
person Moh Lamine    schedule 24.03.2018
comment
Лично я бы не стал создавать этот DBUtile класс, это странная абстракция. Прочтите о DAO и переместите весь код, связанный с базой данных, из сервлета. Я также предлагаю, чтобы на шаге 2 вы объединили свои блоки try-catch в один блок, второй блок не должен (и не может) выполняться, если первый потерпел неудачу. Также читайте в разделе "Попробуйте с ресурсами". Использование GET для удаления является странным и потенциально небезопасным (все, что вам нужно, - это поисковая система, просматривающая вашу страницу, или браузер, предварительно выбирающий ссылки для удаления мыслей). Вам действительно следует использовать POST для удаления. - person Mark Rotteveel; 25.03.2018