返回介绍

1.1 传统的 JDBC 编程

发布于 2025-04-26 13:08:31 字数 3596 浏览 0 评论 0 收藏

Java 程序都是通过 JDBC(Java Data Base Connectivity)连接数据库的,这样我们就可以通过 SQL 对数据库编程。JDBC 是由 SUN 公司(SUN 公司后被 Oracle 公司收购)提出的一系列规范,但是它只定义了接口规范,而具体的实现是交由各个数据库厂商去实现的,因为每个数据库都有其特殊性,这些是 Java 规范没有办法确定的,所以 JDBC 就是一种典型的桥接模式。

传统的 JDBC 编程的使用给我们带来了连接数据库的功能,但是也引发了巨大的问题。代码清单 1-1 是用 JDBC 编程的一个例子。我们将从 MySQL 数据库中查询一个角色的名称,假设我们已经知道角色编号为 1。

代码清单 1-1:JdbcExample.java

public class JdbcExample {    
    private Connection getConnection() {
        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mybatis?zeroDateTime Behavior=convertToNull";
            String user = "root";
            String password = "learn";
            connection = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(JdbcExample.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
        return connection;
    }
    public Role getRole(Long id) {
        Connection connection  = getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = connection.prepareStatement("select id, role_name, note from t_role where id = ?");
            ps.setLong(1, id);
            rs = ps.executeQuery();
            while(rs.next()) {
                Long roleId = rs.getLong("id");
                String userName = rs.getString("role_name");
                String note = rs.getString("note");
                Role role = new Role();
                role.setId(id);
                role.setRoleName(userName);
                role.setNote(note);
                return role;
            }
        } catch (SQLException ex) {
            Logger.getLogger(JdbcExample.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            this.close(rs, ps, connection);
        }
        return null;
    } 
    private void close(ResultSet rs, Statement stmt, Connection connection) {
        try {
            if (rs != null && !rs.isClosed()) {
                rs.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(JdbcExample.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            if (stmt != null && !stmt.isClosed()) {
                stmt.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(JdbcExample.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            if (connection != null && !connection.isClosed()) {
                connection.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(JdbcExample.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public static void main(String[] args) {
        JdbcExample example = new JdbcExample();
        Role role = example.getRole(1L);
        System.err.println("role_name => " + role.getRoleName());
    }
}

从代码中我们可以看出整个过程大致分为以下几步:

  • 使用 JDBC 编程需要连接数据库,注册驱动和数据库信息。

  • 操作 Connection,打开 Statement 对象。

  • 通过 Statement 执行 SQL,返回结果到 ResultSet 对象。

  • 使用 ResultSet 读取数据,然后通过代码转化为具体的 POJO 对象。

  • 关闭数据库相关资源。

使用传统的 JDBC 方式存在一些弊端。其一,工作量相对较大。我们需要先连接,然后处理 JDBC 底层事务,处理数据类型。我们还需要操作 Connection 对象、Statement 对象和 ResultSet 对象去拿到数据,并准确关闭它们。其二,我们要对 JDBC 编程可能产生的异常进行捕捉处理并正确关闭资源。对于一个简单的 SQL 在 JDBC 中尚且如此复杂,何况是更为复杂的应用呢?很快这种模式就被一些新的方法取代,于是 ORM 模型就出现了。不过所有的 ORM 模型都是基于 JDBC 进行封装的,不同的 ORM 模型对 JDBC 封装的强度是不一样的。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。