java - 将一个连接对象传递给java中不同类中的多个方法
问题描述
我想在一个事务中执行多个语句。我创建了一个连接对象并使自动提交为假;
例如,我有五个表需要在一个事务中更新;我为每个类制作了 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、服务和控制器。Business Rules 表将有它的 Java 对象、BusinessRules Dao、BusinessRulesService 和 BusinessRulesController。Value、Attributable 等也是如此。服务可以相互通信,以一种方法更新所有 5 个表。Dao 应该只与它的 Service 和 DTO 对话。
推荐阅读
- php - 无法加载请求的类:服务器中的 M_pdf (centos)
- amazon-web-services - 无法使用带空格的 Cognito 密码,也不清楚错误
- android - Okhttp3 令牌随每个请求更改
- javascript - 为什么在 nuxtServerInit 提交后我的 Vuex 状态没有改变?
- android - 折线在 Google Maps Android 中未顺利追踪
- angular - 将 HTML 传递给 mat 对话框 - Angular Material
- php - 按下另一个表单上的按钮后自动填写表单
- swift - 切片外的饼图条目具有不同的位置偏移
- php - 如何更改长文本 a:3:{s:4:"year";s:4:"2018";s:5:"month";s:2:"07";s:3:"day";s :2:"05";} 至今 2018-07-05
- parallel-processing - Java8中迭代器和拆分器的区别