Spring速查手冊(三)——Spring+JDBC
Spring的資料訪問異常體系
JDBC提供了SQLException異常,它是一個檢查異常,必須要捕獲。 但該異常過於籠統,只要是資料訪問發生問題都丟擲這個異常。因此很難在丟擲該異常後進行恢復,因此該異常就沒有丟擲的必要。 Spring對JDBC的異常進行了轉換,並進行了擴充,使得異常更加具體化,能夠根據異常來進行恢復。 此外,Spring的資料訪問異常均繼承自DataAccessException,它是一個非檢查型異常,因此Spring的資料訪問異常可拋可不拋。
資料訪問模板
Spring的資料訪問採用了模板方法模式,模板方法定義了資料處理過程的主要框架,某些特定的步驟採用抽象函式的方式讓子類去實現。這樣子類在使用時只需關注資料訪問邏輯即可,避免了大量重複程式碼。
Spring針對不同的持久化方案,提供了多種資料訪問模板: - JdbcTemplate - NamedParameterJdbcTemplate - HibernateTemplate - SqlMapClientTemplate //MyBatis的模板
配置資料來源
Spring提供了三種資料來源配置方案: 1. 通過JDBC驅動程式定義的資料來源; 2. 通過JNDI定義的資料來源; 3. 通過連線池定義的資料來源。
使用JNDI資料來源
JNDI是 Java 命名與目錄介面(Java Naming and Directory Interface)。 JNDI配置資料來源就是將資料庫的連線資訊配置在Tomcat等Web容器中,這樣資料庫的連線資訊完全可以在應用程式之外進行管理,當資料來源發生變化時,就不需要修改程式程式碼。
使用連線池的資料來源
Spring並沒有提供資料庫連線池的實現,但可以使用第三方開源方案。 只需定義一個名為dataSource的bean即可,並配置好各項連線資訊。
使用JDBC驅動資料來源
只需定義一個名為dataSource的bean即可,並配置好各項連線資訊。
使用JDBC模板
Spring提供兩種JDBC模板: 1. JdbcTemplate:基本的Jdbc模板 2. NamedParameterJdbcTemplate:在執行查詢時,可以以命名引數的形式繫結到SQl中。
使用JdbcTemplate插入/讀取資料
- 建立JdbcTemplate的bean,並注入dataSource:
@Bean
public JdbcTemplate jdbcTemplate( DataSource dataSource ){
return new JdbcTemplate( dataSource );
}
- 將jdbcTemplate注入給DAO:
@Repository
public class XXXDAOImpl implements XXXDAO{
private JdbcOptions jdbcOptions;
@Inject
public XXXDAOImpl( JdbcOptions jdbcOptions ){
this.jdbcOptions = jdbcOptions;
}
}
- 插入資料:
public void add(User user){
jdbcOptions.update(
"insert into user (username, passwd) values(?,?)",
user.getUsername(),
user.getPasswd()
);
}
- 讀取資料:
public User get(long id){
return jdbcOptions.queryForObject(
"select username,passwd from user id=?",
new UserMapper(), // 結果對映物件
id // 引數
);
}
class UserMapper implments RowMapper<User> {
public User mapRow( ResultSet rs, int rowNum ){
return new User(
rs.getLong("id"),
rs.getString("username"),
rs.getPasswd("passwd")
);
}
}
使用NamedParamterJdbcTemplate
JdbcTemplate中的引數是按照順序傳入的,也就是SQL中“問號”的順序和引數的順序要嚴格一致,而是用NamedParamterJdbcTemplate可以顯示指定引數的順序。
- 建立NamedParamterJdbcTemplate的bean物件,並注入dataSource
- 將NamedParamterJdbcTemplate的bean物件注入給DAO的成員變數jdbcOptions
- 插入資訊:
public void add(User user){
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("username",user.getUsername());
paramMap.put("passwd",user.getPasswd());
jdbcOptions.update(
"insert into user (username, passwd) values(:username, :passwd)",
paramMap
);
}