gpt4 book ai didi

java - 您将如何优化(无代码重复)具有许多此类功能的 Java 代码

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:00:16 25 4
gpt4 key购买 nike

我继承的代码有很多这种形式的交易代码方法:

public void addCourseToCourses(String values)
{
try
{
conn.setAutoCommit(false);
}
catch (SQLException e)
{
Logger.getLogger(connDb.class.getName()).log(Level.SEVERE, null, e);
return;
}
try
{
stmt.executeUpdate("insert into courses values " + values);
conn.commit();
}
catch (SQLException e)
{
try
{
conn.rollback();
}
catch (SQLException ex)
{
Logger.getLogger(connDb.class.getName()).log(Level.SEVERE,null, ex);
}
}
finally
{
try
{
conn.setAutoCommit(true);
}
catch (SQLException ex)
{
Logger.getLogger(connDb.class.getName()).log(Level.SEVERE,null, ex);
}
}
}

方法之间不同的变量部分是

stmt.executeUpdate("insert into courses values " + values);

有时是多次插入,有时是删除。我怀念使用来自 C++ 的宏,但我确信有一种方法可以不为每个方法重复所有这些事务代码。

帮助?

(conn 和 stmt 是类型 java.sql.Connection 和 java.sql.Statement 的类成员)

最佳答案

创建一个接受接口(interface)并包装异常处理的方法。

每个接口(interface)的匿名(或非匿名)实现包含 SQL 调用、它的参数等。

例如(非常粗略):

public void addCourseToCourses(final String values) {
handleSql(new SqlCommand() {
@Override public void run(Statement stmt) {
stmt.executeUpdate("insert into courses values " + values);
}
});
}

handleSql 是类似以下内容的静态导入:

public class SqlWrapper {
public static void handleSql(SqlCommand cmd) {
Connection conn = // get connection;
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
LOG.log(Level.SEVERE, null, e);
return;
}

try {
cmd.run();
conn.commit();
} catch (SQLException e) {
cleanRollback();
} finally {
cleanClose();
}
}
}

可以添加各种看起来合理的钩子(Hook)。通用版本将允许各种返回类型,这可能更合适,具体取决于您的实际需要。

评论提到 RunnableCallable , IMO Runnable 专门用于线程(并且基本接口(interface)不是通用的)。 Callable 是更好的选择,但我希望添加足够多的其他 Hook 来处理特定于 SQL/JDBC 的功能,而我会使用特定于应用程序的功能。 YMMV.

这种模式已经在各地被重新发明;采用类似 Spring JDBC 的东西并直接使用它可能更有意义。

关于java - 您将如何优化(无代码重复)具有许多此类功能的 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8821097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com