版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010741376/article/details/46501657
JdbcTemplate 、NamedParameterJdbcTemplate、SimpleJdbcTemplate的差別
一、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