天天看點

JdbcTemplate 、NamedParameterJdbcTemplate、SimpleJdbcTemplate的差別

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 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