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







  • 相关阅读:
    Java基础(六)判断两个对象相等:equals、hashcode、toString方法
    同时找最大最小值
    0-1背包问题
    大数相加
    单例模式(singleton pattern)
    House Robber
    Binary Tree Paths
    双向链表的插入
    工厂模式(factory pattern)
    装饰者模式(decorator pattern)
  • 原文地址:https://www.cnblogs.com/xuyuanjia/p/5706372.html
Copyright © 2011-2022 走看看