一、JdbcTemplate
首先在配置文件中設置數據源
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
<property name="username" value="scott"></property>
<property name="password" value="123"></property>
</bean>
然后用我在另一篇博客中提到的配置JdbcTemplate的集中方式,任選一種進行JdbcTemplate的配置,下面我選其中的一種方式
配置如下信息:
<bean id=”jdbcTemplate” class=”org.springframework.jdbc.core.JdbcTemplate”>
<property name=”dataSource” ref=”dataSource” />
</bean>
為了能夠使用該模板,需要將該類型作為DAO實現類的屬性,定義如下形式:
public class UserDAOImpl implements UserDAO{
private JdbcTemplate jdbcTemplate
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
該DAO實現類配置如下:
<bean id="userDAO" class="com.spring.jdbcDAOImpl.UserDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
做好如上配置后,就可以在DAO實現類中使用模板
二、NamedParameterJdbcTemplate使用
與JdbcTemplate唯一不同的地方是,在給問號賦值的時候,是按照名字對應的。
對NamedParameterJdbcTemplate的配置與上述JdbcTemplate的配置類似
最大的變化在於,sql語句中不使用?來最為參數替代符。而是使用:加變量名的方式作為參數替代符。
然后在通過Map將變量名與實際值綁定起來,傳遞給update方法。使用這種方式最大的好處就是,如果參數比較多,並且參數位 置或順序可能變化的情況下,
使用NamedParameterJdbcTemplate是非常方便的!
下面是我從網上找的例子:
private static final String MOTORIST_INSERT =
”insert into motorist (id, email, password, ” +
“firstName, lastName) values
(null, :email, :password, :firstName, :lastName)”;
public void saveMotorist(Motorist motorist) {
Map parameters = new HashMap();
parameters.put(”email”, motorist.getEmail());
parameters.put(”password”, motorist.getPassword());
parameters.put(”firstName”, motorist.getFirstName());
parameters.put(”lastName”, motorist.getLastName());
jdbcTemplate.update(MOTORIST_INSERT, parameters);
}
三、SimpleJdbcTemplate使用
SimpleJdbcTemplate加入了Java5的特性支持,例如可變參數、自動拆包封包、泛型等支持。
下面是用SimpleJdbcTemplate實現的findUserByIdSimple(int id)
public User findUserByIdSimple(int id) {
String sql="select id,user_name,password from td where id=?";
ParameterizedRowMapper mapper=new ParameterizedRowMapper(){
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
User u=new User();
u.setId(rs.getInt("id"));
u.setPassword(rs.getString("password"));
u.setUser_name(rs.getString("user_name"));
return u;
}
};
//這里的第三個參數 arguments to bind to the query
return this.simpleJdbcTemplate.queryForObject(sql,mapper, id);
}
這里的ParameterizedRowMapper和RowMapper的最大區別是ParameterizedRowMapper支持泛型
這里的query的方法使用與JdbcTemplate中的query方法使用是有區別的。
第一:JdbcTemplate中的query方法使用Object數組來傳遞參數,而SimpleJdbcTemplate中的query方法使用的是可變參數,
因為是可變參數,所以需要將可變參數放在參數列表的最后部分。
第二:使用了自動封包機制傳遞id數據。
第三:進行結果集與對象映射時,使用了ParameterizedRowMapper類型而不是RowMapper類型,其主要區別就是Parameteri -zedRowMapper類型支持泛型。
同樣是調用update方法,但是該update方法使用了可變參數,這樣就不需要Object數組來進行數據封裝,
所有需要賦值問號的參數將直接作為update參數傳遞。同樣是按照index順序的!
四、使用Spring中的JDBC支持類
這一類型我還沒有動手實現,下面是別人寫的
通過以上的實現,可以使用各種不同的JDBC模板類進行JDBC訪問,但是,如果有很多DAO實現類的定義,我們需要定義很多 重復的代碼部分,
如,我們需要在DAO實現類中定義 JdbcTemplate屬性,並且定義其get、set方法。另外,需要將其聲明在配置文件中。等 等。這些部分是重復的。
spring提供了一種簡化的實現方式,它定義了JdbcDaoSupport父類(針對於JdbcTemplate方式的實現),在該類中完成了 重復的代碼,我們定義的DAO實現類只需要繼承它既可,關系如下圖:
通過這種實現,DAO實現類的定義可以簡化如下:
public class JdbcRantDao extends JdbcDaoSupport implements RantDao {
public void saveMotorist(Motorist motorist) {
getJdbcTemplate().update(MOTORIST_INSERT,
new Object[] { motorist.getEmail(), motorist.getPassword(),
motorist.getFirstName(), motorist.getLastName() });
}
中間沒有任何JdbcTemplate屬性的相關定義。而通過調用getJdbcTemplate()方法獲得JdbcTemplate屬性。
另外,在配置文件中需要定義如下內容:
<bean id=”rantDao” class=”com.roadrantz.dao.jdbc.JdbcRantDao”>
<property name=”jdbcTemplate” ref=”jdbcTemplate” />
</bean>
從定義中可看出,與不使用支持類是有相同的定義方式。但是如果我們的DAO實現類繼承了JdbcDaoSupport 父類。則其配置可以省略掉jdbcTemplate內容的定義,直接做如下配置:
<bean id=”rantDao” class=”com.roadrantz.dao.jdbc.JdbcRantDao”>
<property name=”dataSource” ref=”dataSource” />
</bean>
省略的jdbcTemplate定義和聲明過程!
在上面的介紹中,Spring提供了三種不同的模板類,如果我們想使用NamedParameterJdbcTemplate或SimpleJdbcTemplate,則需要繼承不同的模板支持類型,分別是:
NamedParameterJdbcDaoSupport與SimpleJdbcDaoSupport