Spring JDBC 框架

2019-05-11 17:48 更新

JDBC 框架概述

在使用普通的 JDBC 數(shù)據(jù)庫(kù)時(shí),就會(huì)很麻煩的寫(xiě)不必要的代碼來(lái)處理異常,打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù)連接等。但 Spring JDBC 框架負(fù)責(zé)所有的低層細(xì)節(jié),從開(kāi)始打開(kāi)連接,準(zhǔn)備和執(zhí)行 SQL 語(yǔ)句,處理異常,處理事務(wù),到最后關(guān)閉連接。

所以當(dāng)從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)時(shí),你所做的是定義連接參數(shù),指定要執(zhí)行的 SQL 語(yǔ)句,每次迭代完成所需的工作。

Spring JDBC 提供幾種方法和數(shù)據(jù)庫(kù)中相應(yīng)的不同的類(lèi)與接口。我將給出使用 JdbcTemplate 類(lèi)框架的經(jīng)典和最受歡迎的方法。這是管理所有數(shù)據(jù)庫(kù)通信和異常處理的中央框架類(lèi)。

JdbcTemplate 類(lèi)

JdbcTemplate 類(lèi)執(zhí)行 SQL 查詢(xún)、更新語(yǔ)句和存儲(chǔ)過(guò)程調(diào)用,執(zhí)行迭代結(jié)果集和提取返回參數(shù)值。它也捕獲 JDBC 異常并轉(zhuǎn)換它們到 org.springframework.dao 包中定義的通用類(lèi)、更多的信息、異常層次結(jié)構(gòu)。

JdbcTemplate 類(lèi)的實(shí)例是線(xiàn)程安全配置的。所以你可以配置 JdbcTemplate 的單個(gè)實(shí)例,然后將這個(gè)共享的引用安全地注入到多個(gè) DAOs 中。

使用 JdbcTemplate 類(lèi)時(shí)常見(jiàn)的做法是在你的 Spring 配置文件中配置數(shù)據(jù)源,然后共享數(shù)據(jù)源 bean 依賴(lài)注入到 DAO 類(lèi)中,并在數(shù)據(jù)源的設(shè)值函數(shù)中創(chuàng)建了 JdbcTemplate。

配置數(shù)據(jù)源

我們?cè)跀?shù)據(jù)庫(kù) TEST 中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表 Student。假設(shè)你正在使用 MySQL 數(shù)據(jù)庫(kù),如果你使用其他數(shù)據(jù)庫(kù),那么你可以改變你的 DDL 和相應(yīng)的 SQL 查詢(xún)。

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

現(xiàn)在,我們需要提供一個(gè)數(shù)據(jù)源到 JdbcTemplate 中,所以它可以配置本身來(lái)獲得數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)。你可以在 XML 文件中配置數(shù)據(jù)源,其中一段代碼如下所示:

<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>

數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象(DAO)

DAO 代表常用的數(shù)據(jù)庫(kù)交互的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象。DAOs 提供一種方法來(lái)讀取數(shù)據(jù)并將數(shù)據(jù)寫(xiě)入到數(shù)據(jù)庫(kù)中,它們應(yīng)該通過(guò)一個(gè)接口顯示此功能,應(yīng)用程序的其余部分將訪(fǎng)問(wèn)它們。

在 Spring 中,數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象(DAO)支持很容易用統(tǒng)一的方法使用數(shù)據(jù)訪(fǎng)問(wèn)技術(shù),如 JDBC、Hibernate、JPA 或者 JDO。

執(zhí)行 SQL 語(yǔ)句

我們看看如何使用 SQL 和 jdbcTemplate 對(duì)象在數(shù)據(jù)庫(kù)表中執(zhí)行 CRUD(創(chuàng)建、讀取、更新和刪除)操作。

查詢(xún)一個(gè)整數(shù)類(lèi)型:

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

查詢(xún)一個(gè) long 類(lèi)型:

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

一個(gè)使用綁定變量的簡(jiǎn)單查詢(xún):

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

查詢(xún)字符串:

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

查詢(xún)并返回一個(gè)對(duì)象:

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;
   }
}

查詢(xún)并返回多個(gè)對(duì)象:

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} );

執(zhí)行 DDL 語(yǔ)句

你可以使用 jdbcTemplate 中的 execute(..) 方法來(lái)執(zhí)行任何 SQL 語(yǔ)句或 DDL 語(yǔ)句。下面是一個(gè)使用 CREATE 語(yǔ)句創(chuàng)建一個(gè)表的示例:

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 框架例子

基于上述概念,讓我們看看一些重要的例子來(lái)幫助你理解在 Spring 中使用 JDBC 框架:

序號(hào)例子 & 描述
1Spring JDBC Example

這個(gè)例子將解釋如何編寫(xiě)一個(gè)簡(jiǎn)單的基于 Spring 應(yīng)用程序的 JDBC。

2SQL Stored Procedure in Spring

學(xué)習(xí)在使用 Spring 中的 JDBC 時(shí)如何調(diào)用 SQL 存儲(chǔ)過(guò)程。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)