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
JdbcTemplate 、NamedParameterJdbcTemplate、SimpleJdbcTemplate的区别的更多相关文章
- Spring提供JdbcTemplate&NamedParameterJdbcTemplate
JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdate方法:update方法用于执行新增.修 ...
- Spring jdbcTemplate RowMapper绑定任意对象
RowMapper可以将数据中的每一行封装成用户定义的类,在数据库查询中,如果返回的类型是用户自定义的类型则需要包装,如果是Java自定义的类型,如:String则不需要,Spring最新的类Simp ...
- 使用Spring配置数据源JdbcTemplate
c3p0作为演示 1.编写资源文件(db.properties) jdbc.user=root jdbc.password=root jdbc.jdbcUrl=jdbc:mysql://localho ...
- [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring SimpleJdbcTemplate Querying examples
Here are few examples to show how to use SimpleJdbcTemplate query() methods to query or extract data ...
- Spring SimpleJdbcTemplate查询示例
这里有几个例子来说明如何使用SimpleJdbcTemplate query()方法来查询或从数据库中提取数据.在 JdbcTemplate query() 方法,需要手动转换返回的结果转换为一个目标 ...
- spring思想分析
摘要: EveryBody in the world should learn how to program a computer...because it teaches you how to th ...
- Spring Boot学习随记
由于早年在管理领域耕耘了一段时间,完美错过了Spring的活跃期, 多少对这个经典的技术带有一种遗憾的心态在里面的, 从下面的我的生涯手绘图中大概可以看出来我的经历. 最近由于新介入到了工业数字化领域 ...
- 一个spring jdbc实例
一.使用示例 (1)springJdbcContext.xml <?xml version="1.0" encoding="UTF-8"?> < ...
随机推荐
- APP接口版本兼容的问题
现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改.新的APP和接口开发后,接口如何兼容老的 ...
- (剑指Offer)面试题29:数组中出现次数超过一半的数字
题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- STUN: NAT 类型检测方法
STUN(Simple Transversal of UDP through NATs)[21]是RFC3489 规定的一种NAT 穿透方式,它采用辅助的方法探测NAT 的IP 和端口. STUN 的 ...
- javascript、jquery获取网页的高度和宽度
javascript: 可视区域宽 :document.documentElement.clientWidth (width + padding) 可视区域高 :document.documentE ...
- Java带包编译运行
package cn.togeek.job; public class Test { public static void main(String[] args) throws Exception { ...
- Codeforces Beta Round #29 (Div. 2, Codeforces format) C. Mail Stamps 离散化拓扑排序
C. Mail Stamps Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem ...
- 分享个新浪下载图片的ProgressBar进度样式
https://github.com/eltld/ImageLoadProgress2
- 三星galaxy s4问题解决及快捷操作
http://blog.csdn.net/pipisorry/article/details/38474827 三星galaxy s4更改锁屏方式时出现故障 屏幕锁定设置除password以外,其它锁 ...
- 【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能
相对于上一篇中的代码编写HibernateUtil类以提高程序的执行速度 首先,仍然要写一个javabean(User.java): package cn.itcast.hibernate.domai ...
- Swift2.0 中的String(三):类型转换
本系列第三篇,String相关的类型转换.其他的几篇传送门(GitHub打不开链接的同学请自行把地址github改成gitcafe,或者直接去归档里找:-P): Swift2.0 中的String(一 ...