1. 程式人生 > 其它 >Spring速查手冊(三)——Spring+JDBC

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插入/讀取資料

  1. 建立JdbcTemplate的bean,並注入dataSource:
@Bean
public JdbcTemplate jdbcTemplate( DataSource dataSource ){
    return new JdbcTemplate( dataSource );
}
  1. 將jdbcTemplate注入給DAO:
@Repository
public class XXXDAOImpl implements XXXDAO{
    private JdbcOptions jdbcOptions;

    @Inject
    public XXXDAOImpl( JdbcOptions jdbcOptions ){
        this.jdbcOptions = jdbcOptions;
    } 
}
  1. 插入資料:
public void add(User user){
    jdbcOptions.update(
        "insert into user (username, passwd) values(?,?)",
        user.getUsername(),
        user.getPasswd()
    );
}
  1. 讀取資料:
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可以顯示指定引數的順序。

  1. 建立NamedParamterJdbcTemplate的bean物件,並注入dataSource
  2. 將NamedParamterJdbcTemplate的bean物件注入給DAO的成員變數jdbcOptions
  3. 插入資訊:
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
    );
}