[英]Passing one connection object to multiple methods in different classes in java
我想在一個事務中執行多個語句。 我創建了一個連接對象,並將autocommit設置為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;
}
常見的做法是為每個表/實體提供自己的DAO,服務和控制器。 業務規則表在Java中具有其對象,BusinessRules Dao,BusinessRulesService和BusinessRulesController。 價值,歸因等也是如此。服務可以相互通信以一種方法更新所有5個表。 道僅應與其服務和DTO進行交談。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.