Single Try Catch Block中的多个JDBC语句。这是好的做法吗?

时间:2017-04-25 06:27:32

标签: java jdbc

我是Java新手,我的工作都与JDBC有关 - 关于插入和处理数据。在所有工作正常。

使用单个try{} catch()块来减少代码,以编写多个JDBC StatementsPrepared Statements

示例代码:

public void dashboardReports()
{
    try {

        String total_stock_value="select sum(price*closingstock)as tsv from purchase_table";
        Statement ps_tsv=connection.createStatement();
        ResultSet set_tsv=ps_tsv.executeQuery(total_stock_value);
        if(set_tsv.next())
        {
            total_stock.setText(set_tsv.getString("tsv"));              
        }           

        String tota_sales="select sum(INVOICE_VALUE) as iv from  PARTYWISE_ACCOUNTS_LEDGER";
        Statement st_total_sales=connection.createStatement();
        ResultSet set_total_sales=st_total_sales.executeQuery(tota_sales);
        if(set_total_sales.next())
        {
            total_sales.setText(set_total_sales.getString("iv"));
        }           

        String total_purchases="select sum(CP_INVOICEVALUE)as cpi from COMPANY_PAYMENTS";
        Statement st_tps=connection.createStatement();
        ResultSet set_tps=st_tps.executeQuery(total_purchases);
        if(set_tps.next())
        {
            total_purchases_label.setText(set_tps.getString("cpi"));
        }

        String total_collectionss="select sum(PAYMENT_REC) as payrec from PARTYWISE_ACCOUNTS_LEDGER";
        Statement ps_toco=connection.createStatement();
        ResultSet set_toco=ps_toco.executeQuery(total_collectionss);
        if(set_toco.next())
        {
            total_collections.setText(set_toco.getString("payrec"));
        }

        String total_payments="select sum(CP_PAYMENTREC) as paid from COMPANY_PAYMENTS";
        Statement ps_topa=connection.createStatement();
        ResultSet set_topa=ps_topa.executeQuery(total_payments);
        if(set_topa.next())
        {
            total_payments_label.setText(set_topa.getString("paid"));
        }

    } catch (Exception e) {
        // TODO: handle except
    }
}

这是处理好方法还是其他方式?

到目前为止,我的代码工作得非常好,我们对这种方法有任何未来的问题。

8 个答案:

答案 0 :(得分:4)

这违反了Single ResponsbilitySingle Layer of Abstraction原则。

所以虽然这段代码在技术上是有效的;你不仅要关注正确性,还应关注它的可读性。和可测试性。而且我认为这两者都不是很好的"在你正在显示的输入中。

因此;来自干净的代码(质量)观点;我宁愿建议采取以下措施:

outer method ...
  try {
    helperMethod1();
    helperMethod2();
  } catch( ...

为每个不同的案例提供一个小帮手。当然,你不会就此止步;但试着隔离那些助手的常见的方面;并且可能想方设法使用一个更通用的帮手。

当然:如果可能的话,你尽量避免捕获异常。相反,您可以抓住最具体的异常!

答案 1 :(得分:2)

由于您此处仅执行SELECT操作,因此不需要显式事务,因为您不会更改数据库的状态,也无需回滚。将所有SELECT语句分组到单个try块中没有任何问题。但是,存在一个潜在的缺点,即如果一个SELECT失败,您的代码将退出try块,并且所有后续查询都将无法运行。如果你可以容忍这一点,那么你可以保持原样。与此相似的是一系列连续串联的灯泡;如果一个人休息,那么他们都会出去。

您拥有的替代方法是为每个查询使用单独的try块。然后,即使其中一个例外发生,其他人也可能成功完成。这里的类比是并联电路中的一系列灯泡。

答案 2 :(得分:2)

我认为你的代码还可以。 最后你需要在块中关闭结果集,语句和连接。

答案 3 :(得分:1)

如果您对所有后续SELECT失败感到满意,如果失败,那么我会更改方法以引发异常

public void dashboardReports() throws SQLException 
{
 ....
}

然后从调用方法中捕获SQLException。

注意我认为抛出/抓住SQLException而不是Exception

会更好

答案 4 :(得分:0)

请确保关闭语句和结果集:

try {

    String total_stock_value="select sum(price*closingstock)as tsv from purchase_table";
    try (Statement ps_tsv=connection.createStatement();
        ResultSet set_tsv=ps_tsv.executeQuery(total_stock_value)) {
        if(set_tsv.next())
        {
            total_stock.setText(set_tsv.getString("tsv"));
        }
    }

    String tota_sales="select sum(INVOICE_VALUE) as iv from  PARTYWISE_ACCOUNTS_LEDGER";
    try (Statement st_total_sales=connection.createStatement();
            ResultSet set_total_sales=st_total_sales.executeQuery(tota_sales)) {
        if(set_total_sales.next())
        {
            total_sales.setText(set_total_sales.getString("iv"));
        }
    }

    String total_purchases="select sum(CP_INVOICEVALUE)as cpi from COMPANY_PAYMENTS";
    try (Statement st_tps=connection.createStatement();
            ResultSet set_tps=st_tps.executeQuery(total_purchases)) {
        if(set_tps.next())
        {
            total_purchases_label.setText(set_tps.getString("cpi"));
        }
    }

    String total_collectionss="select sum(PAYMENT_REC) as payrec from PARTYWISE_ACCOUNTS_LEDGER";
    try (Statement ps_toco=connection.createStatement();
            ResultSet set_toco=ps_toco.executeQuery(total_collectionss)) {
        if(set_toco.next())
        {
            total_collections.setText(set_toco.getString("payrec"));
        }
    }

    String total_payments="select sum(CP_PAYMENTREC) as paid from COMPANY_PAYMENTS";
    try (Statement ps_topa=connection.createStatement();
            ResultSet set_topa=ps_topa.executeQuery(total_payments)) {
        if(set_topa.next())
        {
            total_payments_label.setText(set_topa.getString("paid"));
        }
    }

} catch (Exception e) {
    // TODO: handle except
}

}

答案 5 :(得分:0)

更好的方法是创建执行常见操作的方法:

public String execute(String query) throws SQLException {
Statement ps_toco=connection.createStatement();
        ResultSet set_toco=ps_toco.executeQuery(query);
        return set_toco.next();
}

调用此方法时,请使用try catch block将其包围。

答案 6 :(得分:0)

1.您可以使用类似executeQuery(Connection conn, Statement st, String sql)的方法来封装和减少代码行。

2.不要依赖泛型Exception,也要捕获特定于sql的异常类

3.我没有看到finally阻止正确关闭资源,除非你在其他地方这样做。或者,您可以尝试使用try with resource语法来消除finally

的需要

4.在catch块中查看您需要做什么 - 您是否需要在链上方传播异常或者使程序失败?

5.在我看来,ResultSetStatement需要尽可能短,所以尽快关闭它们 - 不要等到单块关闭它们。第1点将有助于实现这一目标。

从技术正确性和有效性的角度来看,编写代码的方式没有任何害处 - 使用单个try-catch来处理所有SQL并消除任何异常(因为我只看到SELECT sqls)但是有清晰,可读和可维护的代码,在这方面,你的代码看起来很糟糕。

答案 7 :(得分:0)

虽然您的代码有效,但我强烈建议重构它以获得更好的维护和可读性,如下所示。另外,请确保正确关闭资源:

public void dashboardReports() {
     handleTotalStocks();
     handleTotalSales();
     handleTotalPurchages();
     //Add others
}

handleTotalStocks()方法:

private void handleTotalStocks() {
       String total_stock_value="select sum(price*closingstock)as tsv 
                     from purchase_table";

     try(Statement ps_tsv=connection.createStatement();
        ResultSet set_tsv=ps_tsv.executeQuery(total_stock_value);) {
         if(set_tsv.next()) {
            total_stock.setText(set_tsv.getString("tsv"));
         }
       }
  }
 //add other methods