Передача одного объекта соединения нескольким методам в разных классах в Java - PullRequest
0 голосов
/ 25 января 2019

Я хочу выполнить несколько операторов в одной транзакции.Я создал объект соединения и сделал автокоммит false;

Например, я получил пять таблиц, которые мне нужно обновить за одну транзакцию;Я сделал 5 классов для каждого класса, это собственный метод обновления.Раньше все эти операторы обновления были в одном методе, но мой учитель сказал мне, что это плохой способ кодирования.Я должен был поместить их в разные классы.

    public boolean updateBusinessRule(BusinessRule businessRule){
    try (Connection con = super.getConnectionConfigDb()) {
        con.setAutoCommit(false);
        // Update table BusinessRule
        if (businessRule.getOperatorID() != 0) {
            String queryBr = "UPDATE BUSINESSRULE SET ERRORMESSAGE = ?, SQLCODE = ?, CUSTOMNAME = ?, OPERATOR_ID = ? WHERE BUSINESSRULE_ID = ?";
            try (PreparedStatement pstmtBr = con.prepareStatement(queryBr)) {
                pstmtBr.setString(1, businessRule.getErrorMessage());
                pstmtBr.setString(2, businessRule.getSqlQuery());
                pstmtBr.setString(3, businessRule.getName());
                pstmtBr.setInt(4, businessRule.getOperatorID());
                pstmtBr.setInt(5, businessRule.getBusinessRuleID());
                pstmtBr.executeUpdate();
            } catch (SQLException e) {
                con.rollback();
                e.printStackTrace();
                return false;
            }
        } else {
            String queryBr = "UPDATE BUSINESSRULE SET ERRORMESSAGE = ?, SQLCODE = ?, CUSTOMNAME = ? WHERE BUSINESSRULE_ID = ?";
            try (PreparedStatement pstmtBr = con.prepareStatement(queryBr)) {
                pstmtBr.setString(1, businessRule.getErrorMessage());
                pstmtBr.setString(2, businessRule.getSqlQuery());
                pstmtBr.setString(3, businessRule.getName());
                pstmtBr.setInt(4, businessRule.getBusinessRuleID());
                pstmtBr.executeUpdate();
            } catch (SQLException e) {
                con.rollback();
                e.printStackTrace();
                return false;
            }
        }

        // Update table TargetTable
        String queryTt = "UPDATE TARGETTABLE SET NAME = ? WHERE TABLE_ID = ?";
        for (int i = 0 ; i < businessRule.getTableListSize() ; i++) {
            try (PreparedStatement pstmtTt = con.prepareStatement(queryTt)) {
                pstmtTt.setString(1,businessRule.getListOfTables().get(i).getName());
                pstmtTt.setInt(2, businessRule.getListOfTables().get(i).getId());
                pstmtTt.executeUpdate();
            } catch (SQLException e) {
                con.rollback();
                e.printStackTrace();
                return false;
            }
        }


        // Update table Attribute
        String queryAt = "UPDATE ATTRIBUTE SET ATTRIBUTENAME = ?, ATTRIBUTETYPE = ?, DATALENGTH = ? WHERE ATTRIBUTE_ID = ?";
        System.out.println(businessRule.getListOfColumns().size());
        for (int i = 0 ; i < businessRule.getColumnListSize() ; i++) {
            try (PreparedStatement pstmtAt = con.prepareStatement(queryAt)) {
                pstmtAt.setString(1,businessRule.getListOfColumns().get(i).getName());
                pstmtAt.setString(2,businessRule.getListOfColumns().get(i).getDataType());
                pstmtAt.setInt(3,businessRule.getListOfColumns().get(i).getDataLength());
                pstmtAt.setInt(4,businessRule.getListOfColumns().get(i).getId());
                pstmtAt.executeUpdate();
            } catch (SQLException e) {
                con.rollback();
                e.printStackTrace();
                return false;
            }
        }

        // Update table Value
        String queryVa = "UPDATE VALUE SET VALUE = ? WHERE VALUE_ID = ?";
        for (int i = 0 ; i < businessRule.getListOfValues().size() ; i++) {
            try (PreparedStatement pstmtVa = con.prepareStatement(queryVa)) {
                pstmtVa.setInt(1,businessRule.getListOfValues().get(i).getValue());
                pstmtVa.setInt(2,businessRule.getListOfValues().get(i).getId());
                pstmtVa.executeUpdate();
            } catch (SQLException e) {
                con.rollback();
                e.printStackTrace();
                return false;
            }
        }


        // Update table Stack
        String querySt = "UPDATE BUSINESSRULESSTACK SET NAME = ? WHERE BUSINESSRULE_ID = ?";
        try (PreparedStatement pstmtSt = con.prepareStatement(querySt)) {
            pstmtSt.setString(1,businessRule.getName());
            pstmtSt.setInt(2,businessRule.getBusinessRuleID());
            pstmtSt.executeUpdate();
        } catch ( SQLException e) {
            con.rollback();
            e.printStackTrace();
            return false;
        }

        /*
        When it reaches this point it means everything went fine so next step is commit and return true
         */

        con.commit();
        return true;
    } catch (SQLException e) {
        e.printStackTrace();
    }

    return false;
}

В одном из новых классов, названном BusinessRuleDaoImpl.java, я написал в нем следующую функцию.Обратите внимание, что он вызывает другой метод в другом классе для выполнения второго оператора с тем же объектом подключения.Я продолжаю делать это до последнего занятия.Ну, я чувствую, что делаю плохую работу, пока не знаю, насколько это хорошо.Может кто-нибудь посоветовать мне, пожалуйста?Спасибо.

    @Override
public boolean updateBusinessRule(BusinessRule businessRule, Connection con) {
    try (Connection conBR = con) {
        if (businessRule.getOperatorID() != 0) {
            String queryBr = "UPDATE BUSINESSRULE SET ERRORMESSAGE = ?, SQLCODE = ?, CUSTOMNAME = ?, OPERATOR_ID = ? WHERE BUSINESSRULE_ID = ?";
            try (PreparedStatement pstmtBr = conBR.prepareStatement(queryBr)) {
                pstmtBr.setString(1, businessRule.getErrorMessage());
                pstmtBr.setString(2, businessRule.getSqlQuery());
                pstmtBr.setString(3, businessRule.getName());
                pstmtBr.setInt(4, businessRule.getOperatorID());
                pstmtBr.setInt(5, businessRule.getBusinessRuleID());
                pstmtBr.executeUpdate();
                return tableDao.updateTable(businessRule,conBR);
            } catch (SQLException e) {
                con.rollback();
                e.printStackTrace();
                return false;
            }
        } else {
            String queryBr = "UPDATE BUSINESSRULE SET ERRORMESSAGE = ?, SQLCODE = ?, CUSTOMNAME = ? WHERE BUSINESSRULE_ID = ?";
            try (PreparedStatement pstmtBr = con.prepareStatement(queryBr)) {
                pstmtBr.setString(1, businessRule.getErrorMessage());
                pstmtBr.setString(2, businessRule.getSqlQuery());
                pstmtBr.setString(3, businessRule.getName());
                pstmtBr.setInt(4, businessRule.getBusinessRuleID());
                pstmtBr.executeUpdate();
            } catch (SQLException e) {
                con.rollback();
                e.printStackTrace();
                return false;
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return false;
}

1 Ответ

0 голосов
/ 25 января 2019

Обычной практикой является предоставление каждой таблице / сущности своих собственных DAO, Service и Controllers. Таблица бизнес-правил будет иметь свой объект на Java, BusinessRules Dao, BusinessRulesService и BusinessRulesController. То же самое можно сказать о Value, Attributable и т. Д. Сервисы могут общаться друг с другом, чтобы обновить все 5 таблиц в одном методе. Дао должны разговаривать только со своей службой и DTO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...