Spring-JDBC 源码学习(0) —— 概览

概览

在学习 Spring-JDBC 之前,我们有必要从 Java 原生提供的 JDBC 开始,对 JDBC 操作的一整套完整的流程有一个清晰的概念。

/**
 * copied from https://www.tutorialspoint.com/jdbc/jdbc-sample-code.htm
 * updated by DorMOUSENone
 */

//STEP 1. 引入必须的包
import java.sql.*;

public class Example {
    // JDBC 驱动名 与 DB URL 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://:/";

    // 数据库登录验证 (用户名、密码等)
    static final String USER = "username";
    static final String PASS = "password";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            //STEP 2: 注册驱动(注册到驱动管理器 DriverManager 类中)
            Class.forName("com.mysql.jdbc.Driver");

            //STEP 3: 创建一个连接
            System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);

            //STEP 4: 执行一个查询
            System.out.println("Creating statement...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, first, last, age FROM Employees";
            ResultSet rs = stmt.executeQuery(sql);

            //STEP 5: 将结果从结果集(ResultSet)中取出
            while(rs.next()){
                //根据列名逐一取出数据
                int id  = rs.getInt("id");
                int age = rs.getInt("age");
                String first = rs.getString("first");
                String last = rs.getString("last");

                //展示结果
                System.out.print("ID: " + id);
                System.out.print(", Age: " + age);
                System.out.print(", First: " + first);
                System.out.println(", Last: " + last);
            }
            //STEP 6: 清理环境
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            //处理 JDBC 错误
            se.printStackTrace();
        }catch(Exception e){
            //处理 Class.forName() 引起的错误
            e.printStackTrace();
        }finally{
            // finally 代码库来关闭资源
            try{
                if(stmt!=null)
                    stmt.close();
            }catch(SQLException se2){
            }// 不做任何处理
            try{
                if(conn!=null)
                    conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }
}

从上面的通用 JDBC 代码可以看到,利用 Java 原生提供的 java.sql.* 包可以完成注册驱动,创建连接,执行查询,处理结果等一系列一整套操作。

而 Spring-JDBC 对于 Java 原生提供的 JDBC ,对一系列数据及操作进行了整合:

  1. 实现了 DataSource 接口,用于整合数据源配置,将各种零散的属性值(诸如 URL、用户名、 密码等)整合成完整的一个对象,便于重用;也实现了 getConnection(…) 接口,便于直接通过 DataSource 获取连接。
  2. 对执行查询的流程进行了封装。
  3. 对结果集的处理提供了多种接口,针对不同的应用场景可自由选择所必须的实现类。例如直接通过 JDBC 获得 Bean ,而无需如上例 39-42 行所示,逐一编码进行提取。

本节提供对《Spring-JDBC 源码学习》完整学习过程的一个梳理:

  1. JdbcTemplate 一节作为学习 Spring-jdbc 的切入点,是 org.springframework.jdbc.core 包中的核心类,是一个提供不同场景下数据库操作的模板类。主要描述其持有的属性 DataSource 等以及其实现的方法。
  2. DataSource 一节承接 JdbcTemplate 一节,提供 Spring-jdbc 对数据源的一个包装与应用。同时描述其核心方法 getConnection(…) 的实现。
  3. DriverManager 描述其对不同数据库供应商提供的驱动的管理与使用方法。同时简单描述通过具体驱动获得一个连接的实现。
  4. PreparedStatement & CallableStatement 一节主要表述 Spring-jdbc 如何对执行查询的流程进行了封装。特别是对于 PreparedStatement 与 CallableStatement 这类预置可变 SQL 语句,在执行前必须对其中可变参数进行补全的 Statement 。
  5. ResultSet 描述 Spring-jdbc 如何对结果集进行处理,提供了多种不同的接口实现不同的处理逻辑。这种封装后的操作可以极大地简化直接使用 Java 原生 JDBC 所必须的硬编码提取数据的问题。

你可能感兴趣的:(Spring-JDBC)