zoukankan      html  css  js  c++  java
  • 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







  • 相关阅读:
    _bzoj1061 [Noi2008]志愿者招募【最小费用最大流】
    _bzoj2243 [SDOI2011]染色【树链剖分】
    _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】
    _bzoj1002 [FJOI2007]轮状病毒【瞎搞】
    leetcode 273 Integer to English Words
    leetcode 12 Integer to Roman
    leetcode 1071 Greatest Common Divisor of Strings
    lc6 ZigZag Conversion
    lc13 Roman to Integer
    leetcode 171 Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/xuyuanjia/p/5706372.html
Copyright © 2011-2022 走看看