Spring 中的 JDBC

2020/11/17 20

Spring

数据持久化技术有很多种,而 Hibernate、iBatis、MyBatis 和 JPA 只是其中的几种而已。尽管如此,还是有很多应用程序使用最古老的方式将 Java 对象保存到数据库中,这种久经考验并证明行之有效的持久化方式就是古老的 JDBC。

JDBC 不要求我们掌握其他框架的查询语言,它时建立在 SQL 之上的,而 SQL 本身就是数据访问语言。此外,与其它技术相比,使用 JDBC 能够更好地对数据访问的性能进行调优。JDBC 允许你使用数据库的所有特性,而这是其他框架不鼓励甚至禁止的。

再者,相对于持久层框架,JDBC 能够让我们在更低的层次上处理数据,我们可以完全控制应用程序如何读取和管理数据,包括访问和管理数据库中单独的列。这种细粒度的数据访问方式在很多应用程序中是很方便的。

但是 JDBC 也不是十全十美的,虽然 JDBC 具有强大、灵活和其他一些优点,但也有其不足之处。

失控的 JDBC 代码

private static final String SQL_INSERT_SPITTER = "insert into spitter(username, password) values (?, ?)";

private DataSource dataSource;

public void addSpitter(Spitter spitter) {
    Connection conn = null;
    PreparedStatement stmt = null;
    try {
        conn = dataSource.getConnection();
        stmt = conn.prepareStatement(SQL_INSERT_SPITTER);
        stmt.setString(1, spitter.getUsername());
        stmt.setString(2, spitter.getPassword());
        stmt.execute();
    } catch (SQLException e) {
        // do something... not sure what, though
    } finally {
        try {
            if (stmt != null)
                stmt.close();
            if (conn != null)
                conn.close();
        } catch (SQLException e) {
            // I'm even less sure about what to do here
        }
    }
}

对于一个简单的 insert 操作,使用 JDBC 需要写太多样板代码了,20% 的代码是用于实际操作,剩下的 80% 的代码都是样板代码。这些样板代码非常重要,清理资源和处理错误确保数据访问的健壮性,如果没有它们的话,可能会导致意外的代码和资源泄露。我们不仅需要这些代码,而且还要保证它是正确的。基于这样的原因,我们才需要框架来保证这些代码只写一次而且是正确的。

Spring JDBC

Spring 的 JDBC 框架承担了资源管理和异常处理的工作,从而简化了 JDBC 代码,让我们只需要编写必要代码。

Spring 将数据访问的样板代码抽象到模板类中,Spring 为 JDBC 提供了三个模板类供选择:

以前,在选择哪一个 JDBC 模板时,需要仔细权衡。但是从 Spring 3.1 开始,做这个决定变得容易多了。SimpleJdbcTemplate 已经被废弃了,其 Java 5 的特性被转移到 JdbcTemplate 中,并且只有在你需要使用命名参数的时候,才需要使用 NamedParameterJdbcTemplate。