天天看點

Spring架構JDBC

一,JDBC在Spring中的架構

Spring JDBC 架構負責所有的低層細節,從開始打開連接配接,準備和執行 SQL 語句,處理異常,處理事務,到最後關閉連接配接。

Spring JDBC 提供幾種方法和資料庫中相應的不同的類與接口。我将給出使用 JdbcTemplate 類架構的經典和最受歡迎的方法。這是管理所有資料庫通信和異常處理的中央架構類。

1.JdbcTemplate 類

JdbcTemplate 類

  • 執行 SQL 查詢、更新語句和存儲過程調用,執行疊代結果集和提取傳回參數值。
  • 捕獲 JDBC 異常并轉換它們到 org.springframework.dao 包中定義的通用類、更多的資訊、異常層次結構。

JdbcTemplate 類的執行個體是線程安全配置的。是以你可以配置 JdbcTemplate 的單個執行個體,然後将這個共享的引用安全地注入到多個 DAOs 中。

使用 JdbcTemplate 類時常見的做法:

  • 在Spring 配置檔案中配置資料源,
  • 共享資料源 bean 依賴注入到 DAO 類中,
  • 在資料源的設值函數中建立了 JdbcTemplate。

重要步驟如下:

  1. 配置資料源

    建表:我們在資料庫 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)
);
           

xml檔案中配置資料源:現在,我們需要提供一個資料源到 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>
           

2.資料通路對象(DAO)

**DAO 代表常用的資料庫互動的資料通路對象。**DAOs 提供一種方法來讀取資料并将資料寫入到資料庫中,它們應該通過一個接口顯示此功能,應用程式的其餘部分将通路它們。

在 Spring 中,資料通路對象(DAO)支援很容易用統一的方法使用資料通路技術,如 JDBC、Hibernate、JPA 或者 JDO。

3.執行SQL語句

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

3.執行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 );
           

例子1:Spring JDBC示例:如何編寫一個簡單地基于Spring應用程式的JDBC

例子2:使用Spring中JDBC時如何調用SQL存儲過程