鍍金池/ 教程/ Java/ JDBC 框架概述
Spring MVC Hello World 例子
事務(wù)管理
JDBC 框架概述
MVC 框架教程
Spring 自動裝配 ‘byName’
Spring 中的自定義事件
Spring 編程式事務(wù)管理
環(huán)境設(shè)置
概述
Spring 中 SQL 的存儲過程
體系結(jié)構(gòu)
Spring 中的事件處理
Spring 靜態(tài)頁面例子
基于注解的配置
依賴注入
Spring 自動裝配 ‘byType’
Spring 由構(gòu)造函數(shù)自動裝配
Spring @Qualifier 注釋
Spring ApplicationContext 容器
Spring 中基于 AOP 的 XML架構(gòu)
Bean 的生命周期
IoC 容器
注入內(nèi)部 Beans
Spring JDBC 示例
Spring 基于構(gòu)造函數(shù)的依賴注入
Spring @Required 注釋
Hello World 實例
Bean 定義
Sping 的 BeanFactory 容器
Spring 頁面重定向例子
Bean 定義繼承
Spring 中基于 AOP 的 @AspectJ
注入集合
Beans 自動裝配
Spring 異常處理例子
Spring 聲明式事務(wù)管理
Spring @Autowired 注釋
基于 Java 的配置
Spring MVC 表單處理例子
Spring——Bean 后置處理器
使用 Log4J 記錄日志
Spring 基于設(shè)值函數(shù)的依賴注入
Spring JSR-250 注釋
Bean 的作用域
Spring 框架的 AOP

JDBC 框架概述

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

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

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

JdbcTemplate 類

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

JdbcTemplate 類的實例是線程安全配置的。所以你可以配置 JdbcTemplate 的單個實例,然后將這個共享的引用安全地注入到多個 DAOs 中。

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

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

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

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

現(xiàn)在,我們需要提供一個數(shù)據(jù)源到 JdbcTemplate 中,所以它可以配置本身來獲得數(shù)據(jù)庫訪問。你可以在 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ù)訪問對象(DAO)

DAO 代表常用的數(shù)據(jù)庫交互的數(shù)據(jù)訪問對象。DAOs 提供一種方法來讀取數(shù)據(jù)并將數(shù)據(jù)寫入到數(shù)據(jù)庫中,它們應(yīng)該通過一個接口顯示此功能,應(yīng)用程序的其余部分將訪問它們。

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

執(zhí)行 SQL 語句

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

查詢一個整數(shù)類型:

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

執(zhí)行 DDL 語句

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

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 Example

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

2 SQL Stored Procedure in Spring

學習在使用 Spring 中的 JDBC 時如何調(diào)用 SQL 存儲過程。