Spring - JDBC 框架概述



在使用普通的 JDBC 與資料庫互動時,編寫不必要的程式碼來處理異常、開啟和關閉資料庫連線等變得很麻煩。但是,Spring JDBC 框架負責所有底層細節,從開啟連線、準備和執行 SQL 語句、處理異常、處理事務,最後關閉連線。

因此,您需要做的只是定義連線引數,指定要執行的 SQL 語句,並在從資料庫獲取資料時為每次迭代執行所需的工作。

Spring JDBC 提供了幾種方法,以及相應不同的類來與資料庫互動。我將採用經典且最流行的方法,該方法使用框架的JdbcTemplate類。這是管理所有資料庫通訊和異常處理的核心框架類。

JdbcTemplate 類

JDBC Template 類執行 SQL 查詢、更新語句、儲存過程呼叫,對 ResultSet 進行迭代,並提取返回的引數值。它還會捕獲 JDBC 異常並將它們轉換為 org.springframework.dao 包中定義的通用、更具資訊量的異常層次結構。

JdbcTemplate 類的例項一旦配置後就是執行緒安全的。因此,您可以配置一個JdbcTemplate的單個例項,然後安全地將此共享引用注入到多個 DAO 中。

使用 JDBC Template 類時,一種常見做法是在 Spring 配置檔案中配置一個DataSource,然後將該共享 DataSource Bean 依賴注入到您的 DAO 類中,並且 JdbcTemplate 在 DataSource 的 setter 中建立。

配置資料來源

讓我們在我們的資料庫TEST中建立一個數據庫表Student。我們假設您正在使用 MySQL 資料庫,如果您使用任何其他資料庫,則可以相應地更改您的 DDL 和 SQL 查詢。

CREATE TABLE Student(
   ID   INT NOT NULL AUTO_INCREMENT,
   NAME VARCHAR(20) NOT NULL,
   AGE  INT NOT NULL,
   PRIMARY KEY (ID)
);

現在我們需要向 JDBC Template 提供一個 DataSource,以便它可以自行配置以獲取資料庫訪問許可權。您可以在 XML 檔案中使用如下程式碼片段配置 DataSource:

<bean id = "dataSource" 
   class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
   <property name = "url" value = "jdbc:mysql://:3306/TEST"/>
   <property name = "username" value = "root"/>
   <property name = "password" value = "password"/>
</bean>

資料訪問物件 (DAO)

DAO 代表資料訪問物件,通常用於資料庫互動。DAO 的存在是為了提供一種讀取和寫入資料庫資料的方法,並且它們應該透過一個介面公開此功能,應用程式的其餘部分將透過該介面訪問它們。

Spring 中的 DAO 支援使您可以以一致的方式輕鬆使用 JDBC、Hibernate、JPA 或 JDO 等資料訪問技術。

執行 SQL 語句

讓我們看看如何使用 SQL 和 JDBC Template 物件對資料庫表執行 CRUD(建立、讀取、更新和刪除)操作。

查詢整數

String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );

查詢長整數

String SQL = "select count(*) from Student";
long rowCount = jdbcTemplateObject.queryForLong( SQL );

使用繫結變數的簡單查詢

String SQL = "select age from Student where id = ?";
int age = jdbcTemplateObject.queryForInt(SQL, new Object[]{10});

查詢字串

String SQL = "select name from Student where id = ?";
String name = jdbcTemplateObject.queryForObject(SQL, new Object[]{10}, String.class);

查詢並返回物件

String SQL = "select * from Student where id = ?";
Student student = jdbcTemplateObject.queryForObject(
   SQL, new Object[]{10}, new StudentMapper());

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      
      return student;
   }
}

查詢並返回多個物件

String SQL = "select * from Student";
List<Student> students = jdbcTemplateObject.query(
   SQL, new StudentMapper());

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setID(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      
      return student;
   }
}

將一行插入表中

String SQL = "insert into Student (name, age) values (?, ?)";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 11} );

更新表中的一行

String SQL = "update Student set name = ? where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{"Zara", 10} );

從表中刪除一行

String SQL = "delete Student where id = ?";
jdbcTemplateObject.update( SQL, new Object[]{20} );

執行 DDL 語句

您可以使用jdbcTemplate中的execute(..)方法執行任何 SQL 語句或 DDL 語句。以下是如何使用 CREATE 語句建立表的示例:

String SQL = "CREATE TABLE Student( " +
   "ID   INT NOT NULL AUTO_INCREMENT, " +
   "NAME VARCHAR(20) NOT NULL, " +
   "AGE  INT NOT NULL, " +
   "PRIMARY KEY (ID));"

jdbcTemplateObject.execute( SQL );

Spring JDBC 框架示例

基於上述概念,讓我們檢查一些重要的示例,這些示例將幫助您瞭解在 Spring 中使用 JDBC 框架的方法:

序號 示例和說明
1 Spring JDBC 示例

此示例將說明如何編寫簡單的基於 JDBC 的 Spring 應用程式。

2 Spring 中的 SQL 儲存過程

瞭解如何在 Spring 中使用 JDBC 呼叫 SQL 儲存過程。

廣告