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








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM