在使用普通的 JDBC 數據庫時,就會很麻煩的寫不必要的代碼來處理異常,打開和關閉數據庫連接等。但 Spring JDBC 框架負責所有的低層細節,從開始打開連接,準備和執行 SQL 語句,處理異常,處理事務,到最后關閉連接。
所以當從數據庫中獲取數據時,你所做的是定義連接參數,指定要執行的 SQL 語句,每次迭代完成所需的工作。
Spring JDBC 提供幾種方法和數據庫中相應的不同的類與接口。我將給出使用 JdbcTemplate 類框架的經典和最受歡迎的方法。這是管理所有數據庫通信和異常處理的中央框架類。
JdbcTemplate 類執行 SQL 查詢、更新語句和存儲過程調用,執行迭代結果集和提取返回參數值。它也捕獲 JDBC 異常并轉換它們到 org.springframework.dao 包中定義的通用類、更多的信息、異常層次結構。
JdbcTemplate 類的實例是線程安全配置的。所以你可以配置 JdbcTemplate 的單個實例,然后將這個共享的引用安全地注入到多個 DAOs 中。
使用 JdbcTemplate 類時常見的做法是在你的 Spring 配置文件中配置數據源,然后共享數據源 bean 依賴注入到 DAO 類中,并在數據源的設值函數中創建了 JdbcTemplate。
我們在數據庫 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)
);
現在,我們需要提供一個數據源到 JdbcTemplate 中,所以它可以配置本身來獲得數據庫訪問。你可以在 XML 文件中配置數據源,其中一段代碼如下所示:
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/TEST"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
DAO 代表常用的數據庫交互的數據訪問對象。DAOs 提供一種方法來讀取數據并將數據寫入到數據庫中,它們應該通過一個接口顯示此功能,應用程序的其余部分將訪問它們。
在 Spring 中,數據訪問對象(DAO)支持很容易用統一的方法使用數據訪問技術,如 JDBC、Hibernate、JPA 或者 JDO。
我們看看如何使用 SQL 和 jdbcTemplate 對象在數據庫表中執行 CRUD(創建、讀取、更新和刪除)操作。
查詢一個整數類型:
String SQL = "select count(*) from Student";
int rowCount = jdbcTemplateObject.queryForInt( SQL );
查詢一個 long 類型:
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} );
你可以使用 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 框架:
序號 | 例子 & 描述 |
---|---|
1 | Spring JDBC Example 這個例子將解釋如何編寫一個簡單的基于 Spring 應用程序的 JDBC。 |
2 | SQL Stored Procedure in Spring 學習在使用 Spring 中的 JDBC 時如何調用 SQL 存儲過程。 |