我是Java新手,我的工作都与JDBC有关 - 关于插入和处理数据。在所有工作正常。
使用单个try{} catch()
块来减少代码,以编写多个JDBC
Statements
和Prepared 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
}
}
这是处理好方法还是其他方式?
到目前为止,我的代码工作得非常好,我们对这种方法有任何未来的问题。
答案 0 :(得分:4)
这违反了Single Responsbility和Single 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.在我看来,ResultSet
和Statement
需要尽可能短,所以尽快关闭它们 - 不要等到单块关闭它们。第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