JdbcTemplate 、NamedParameterJdbcTemplate、SimpleJdbcTemplate的区别

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010741376/article/details/46501657 ...
版权声明:本文为博主原创文章,未经博主允许不得转载。 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
相关文章
|
网络协议 Shell 网络安全
在外SSH远程连接macOS服务器【cpolar内网穿透】
macOS系统自带有Secure Shell 客户端,它可让您登录到侦听传入SSH连接的远程服务器和台式机。我们可以用ssh username@ip来ssh到服务器,但通常局限于局域网内的远程。
1089 0
|
开发工具 git
IDEA中Git面板操作介绍 变基、合并、提取、拉取、签出
在IDEA的Git面板中,仓库会分为本地仓库和远程仓库,代码仓库里面放的是各个分支。
4986 2
|
2月前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
2024 4
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
923 3
|
存储 Oracle 关系型数据库
oracle数据恢复—oracle数据库执行错误truncate命令的数据恢复案例
oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下,oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况,例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致数据丢失的数据库数据恢复过程。
|
Java Maven Spring
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
这篇文章介绍了在IntelliJ IDEA社区版中创建Spring Boot项目的三种方法,特别强调了第三种方法的详细步骤。
17303 0
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
2994 3
|
Java Apache Maven
mvnd 安装和配置
mvnd 安装和配置
1459 0
mvnd 安装和配置
|
存储 关系型数据库 MySQL
MySQL中的DISTINCT与GROUP BY:效率之争与实战应用
【8月更文挑战第12天】在数据库查询优化中,DISTINCT和GROUP BY常常被用来去重或聚合数据,但它们在实现方式和性能表现上却各有千秋。本文将深入探讨两者在MySQL中的效率差异,结合工作学习中的实际案例,为您呈现一场技术干货分享。
1672 0