【问题标题】:Should Java JDBC Select statements always be in a Try-Catch block?Java JDBC Select 语句是否应该始终位于 Try-Catch 块中?
【发布时间】:2022-08-19 23:33:56
【问题描述】:

将所有 Java JDBC Select 语句放在 try-catch 块中是一种好习惯吗?目前我在没有它的情况下编写了大部分代码。但是,我会尝试捕获插入/更新/删除。

String sqlQuery = \"Select productId, productName, productStartDate from dbo.product where productId = 5\"

public getProductData() {
    ....
    List<Product> productList =  namedJdbcTemplate.query(sqlQuery, new ProductMapper());
  • 为什么这被否决了?我在尝试学习

标签: java spring-boot jdbc


【解决方案1】:

首先,如果您使用的是原始 JDBC API,您应该始终使用PreparedStatement

是的,您只需要在某些时候用 try-catch 块包装代码,尽管立即或在逻辑上适合的地方捕获异常是一种很好的做法。在 SQL 查询的情况下,您实际上应该将它们全部包装到某个 Service 类中,这样您就可以访问修改数据库对象,而无需每次都运行 JDBC API。例如:

public class UserService {
    private static final String CREATE_USER_SQL = "...";
    private final Connection jdbcConnection;

    public @Nullable User createUser(final String name) {
        try (final PreparedStatement stmt = jdbcConnection.prepareStatement(CREATE_USER_SQL)) {
            jdbcConnection.setAutoCommit(false);
            stmt.setString(1, name);
            stmt.executeQuery();
            jdbcConnection.commit();
            return new User(name);
        } catch (final SQLException createException) {
            System.out.printf("User CREATE failed: %s\n", createException.getMessage());
            try {
                jdbcConnection.rollback();
            } catch (final SQLException rollbackException) {
                System.out.printf("Rollback failed: %s\n", rollbackException.getMessage());
            }
            return null;
        }
    }
}

这立即解决了两个问题:

  1. 您不需要将样板 JDBC 代码放在任何地方;

  2. 它会立即记录任何 JDBC 错误,因此您无需经历复杂的调试过程。

【讨论】:

  • OP 使用的是 Spring Boot,因此是 namedJdbcTemplate。这允许您使用有意义的参数名称而不是容易出错的参数编号。
  • @KlitosKyriacou,我什至没有注意到,谢谢:D
【解决方案2】:

如果您使用 JDBC 进行查询,则尝试捕获 DB 层代码很重要。

想一想,如果连接断开怎么办?或者如果数据库崩溃了怎么办?或者出现其他一些不幸的情况。

对于这些事情,我建议您始终将 DB 层代码保留在 try-catch 中。

也推荐给你一些回退机制在上述事件的情况下。

【讨论】:

    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多