NamedParameterJdbcTemplate中包含了一个JdbcTemplate,NamedParameterJdbcTemplate中的很多方法实际上还是交由JdbcTemplate去完成。NamedParameterJdbcTemplate较JdbcTemplate增加的功能是对输入的条件参数取别名。例如:

String sql2 = "select id,tname as name,tpwd as password from tadd where tname = :name";将查询参数中数据库的列名tname换成了name。

SimpleJdbcTemplate中包含了一个NamedParameterJdbcTemplate,SimpleJdbcTemplate中的很多实现是交由了底层的JdbcTemplate去完成。SimpleJdbcTemplate所增强的功能是泛型和可变长度的参数。

Spring 3.1版本之后,NamedParameterJdbcTemplate和JdbcTemplate也支持了泛型,SimpleJdbcTemplate就被标注为了过时。但是在Spring 3.1版本之前,能使用SimpleJdbcTemplate还是要使用SimpleJdbcTemplate。

SimpleJdbcTemplate中的主要方法如下:

  mysql> desc tadd; 

  +-------+------------------------+--------+--------+-------------+------------------------------------+

  | Field | Type                                | Null     | Key        | Default        | Extra                            |

  +-------+----------------------+-----------+--------+--------------+-----------------------------------+

  | id     | bigint(255)          | NO          | PRI        |                     | auto_increment                      |

  | tname | varchar(300)                | YES        |               | NULL         |                                   |

  | tpwd  | varchar(300) | YES      |                 | NULL    |              |                                                               |

  +-----------+--------------------+---------+--------+---------------+-----------------------------------+

  mysql> insert into tadd(tname,tpwd) values ('apply','asure');

首先来看只返回一条记录的查询操作,返回多条记录将失败。

使用queryForObject方法及其重载的方法  

1. 没有JavaBean时的操作,使用queryForObject(String sql, RowMapper<T> rm, Map<String, ?> args):

String sql2 = "select id,tname as name,tpwd as password from tadd where tname = :n";
RowMapper<UserBean> rw = new RowMapper<UserBean>(){
@Override
public UserBean mapRow(ResultSet paramResultSet, int paramInt) throws SQLException {
UserBean ub = new UserBean();
ub.setId(paramResultSet.getObject("id") + "");
ub.setName(paramResultSet.getObject("name") + "");
ub.setPassword(paramResultSet.getObject("password") + "");
return ub;
}
};
Map<String, String> map = new HashMap<String, String>();
map.put("n", "apply");
UserBean ub = jdbctemplate.queryForObject(sql2, rw, map);

 查询语句中as后面的名称是别名,会将查询结果中数据库的列名替换为别名。tname = :n条件参数取别名有二个作用,一是可以作用于Map参数,第二个是作用于下面的BeanPropertySqlParameterSource,使用BeanPropertySqlParameterSource时别名要和JavaBean中的名称一致。

  2.也可以使用可变长度的参数,这时条件参数不能取别名,要使用占位符的形式:

String sql2 = "select id,tname as name,tpwd as password from tadd where tname = ?";
UserBean ub = jdbctemplate.queryForObject(sql2, rw, "apply");

 

3.创建一个名为UserBean的JavaBean,属性为id,name和password,对应属性有get和set方法。

使用方法:T queryForObject(String sql, ParameterizedRowMapper<T> rm, Map<String, ?> args)

UserBean ub = jdbctemplate.queryForObject(sql2, new BeanPropertyRowMapper(UserBean.class),map);

可以使用可变长度的参数,这时sql中也同样条件参数不能取别名:

UserBean ub = jdbctemplate.queryForObject(sql2, new BeanPropertyRowMapper(UserBean.class),"apply");

4.还可以将Map参数替换,采用完全的面向对象的方式:

String sql2 = "select id,tname as name,tpwd as password from tadd where tname = :name";

userb.setName("apply");

UserBean ub = jdbctemplate.queryForObject(sql2, new BeanPropertyRowMapper(UserBean.class),new BeanPropertySqlParameterSource(userb));

  注意:使用BeanPropertySqlParameterSource时别名要和JavaBean中的名称一致,否则会出错,和第一种情况比较。

5.查询结果又多条时,可以使用query,queryForList或者queryForMap,只要弄清楚参数中的ParameterizedRowMapper和SqlParameterSource即可。

查询结果为基本类型或者String型时,可以使用queryForObject, queryForInt等。

查询的操作使用各种的query重载方法,增加、删除、修改的操作使用各种的update重载方法,使用类似。

还有就是批量修改使用batchUpdate的各种重载方法。

6. NamedParameterJdbcTemplate中的各方法与SimpleJdbcTemplate类似,可能参数的顺序会不太一样。有下面几个有用的方法:

  用KeyHolder获取新插入数据的主键值,可以是单一主键或者是联合主键。

String sql3 = "insert into tadd(tname) values (:name)";

UserBean userb = new UserBean();

userb.setName("applyee");

KeyHolder kh = new GeneratedKeyHolder();

jdbctemplate.update(sql3, new BeanPropertySqlParameterSource(userb), kh);

userb.setId(kh.getKey().intValue()+ "");

7.行映射器ResultSetExtractor,RowCallbackHandler,RowMapper。

RowMapper前面已经用到,应用起来也最为简单,只需要处理单行数据即可。

String sql4 = "select id,tname as name,tpwd as password from tadd where id < :id";
RowMapper<UserBean> rw = new RowMapper<UserBean>(){
@Override
public UserBean mapRow(ResultSet paramResultSet, int paramInt) throws SQLException {
UserBean ub = new UserBean();
ub.setId(paramResultSet.getObject("id") + "");
ub.setName(paramResultSet.getObject("name") + "");
ub.setPassword(paramResultSet.getObject("password") + "");
return ub;
}
};
UserBean user = new UserBean();
user.setId("4");
List<UserBean> users = jdbctemplate.query(sql4, new BeanPropertySqlParameterSource(user), rw);
for(UserBean u: users){
System.out.println(u);
}

  RowCallbackHandler需要自己处理每行的数据

final List<UserBean> userList = new ArrayList<UserBean>();
RowCallbackHandler rch = new RowCallbackHandler(){
@Override
public void processRow(ResultSet paramResultSet)
throws SQLException {
UserBean ub = new UserBean();
ub.setId(paramResultSet.getObject("id") + "");
ub.setName(paramResultSet.getObject("name") + "");
ub.setPassword(paramResultSet.getObject("password") + "");
userList.add(ub);
} }; UserBean user = new UserBean();
user.setId("4");
jdbctemplate.query(sql4, new BeanPropertySqlParameterSource(user), rch);
for(UserBean u: userList){
System.out.println(u);
}

  ResultSetExtractor也需要自己处理结果集:

ResultSetExtractor rse = new ResultSetExtractor(){
public Object extractData(ResultSet rs)
throws SQLException, DataAccessException {
List<UserBean> userList = new ArrayList<UserBean>();
while(rs.next()){
UserBean ub = new UserBean();
ub.setId(rs.getObject("id") + "");
ub.setName(rs.getObject("name") + "");
ub.setPassword(rs.getObject("password") + "");
userList.add(ub);
}
return userList;
}
}; UserBean user = new UserBean();
user.setId("4");
List<UserBean> ul = jdbctemplate.query(sql4, new BeanPropertySqlParameterSource(user), rse);
for(UserBean u: ul){
System.out.println(u);
}

8.还可以使用回调函数的方式来实现,相当于自己可以使用JDBC重写代码,而不是使用封装好的方法:

sql语句的回调,使用PreparedStatementCallback返回已经编译好的sql语句再进行处理

test.execute("update xx set name = 'oo' where id= ?",
new PreparedStatementCallback(){
public Object doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
ps.setString(1, "123");//这里的参数对应?
ps.addBatch();
ps.setString(1, "456");
ps.addBatch();
return ps.executeBatch();
}
});

连接的回调execute(ConnectionCallback<T> action)

9. 通过JDBCTemplate操作数据库,链接是不需要手动地关闭的,但是如果从JDBCTemplate中获取了链接则需要手动地去关闭链接。

例如,jdbcTemplate.getDataSource().getConnection()就需要自己去关闭数据库链接,否则会导致严重的后果。

DataSourceUtils.releaseConnection(con, getDataSource());

JdbcTemplate的使用的更多相关文章

  1. JdbcTemplate+PageImpl实现多表分页查询

    一.基础实体 @MappedSuperclass public abstract class AbsIdEntity implements Serializable { private static ...

  2. Spring JdbcTemplate

    参考链接: https://my.oschina.net/u/437232/blog/279530 http://jinnianshilongnian.iteye.com/blog/1423897 J ...

  3. jdbcTemplate批量插入(添加)

    public void addSubscibe(List<PermedipUserSubscribeVo> list) { final List<PermedipUserSubscr ...

  4. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  5. Spring MVC篇二、使用JdbcTemplate进行数据库操作

    上一篇只是一个简单的Spring MVC框架,接下来添加一些跟数据库的交互. 一.添加jdbc相关配置   在maven中添加相关依赖后,配置数据库访问参数及数据源.数据库参数使用配置文件,代码如下: ...

  6. 使用Spring JdbcTemplate实现数据库操作

    今天我来演示 关于JDBCTemplate实现对数据库的查询和添加 首先是添加 第一步大家都知道 创建一个实体类 然后写一个方法 把实体类当参数传进去 在实现这个接口 JdbcDaoSupport这个 ...

  7. JdbcTemplate进行查询

    1.jdbcTemplate.queryForInt() 和 jdbcTemplate.queryForLong() 例如:下面使用queryForInt()方法传回user表中的记录数: jdbcT ...

  8. jdbcTemplate之jdbc模板技术

    1:为什么要使用jdbcTemplate? 在实际开发中使用jdbc技术太过复杂,为了减少代码冗余,操作简单 步骤一:创建实体类 package beans; public class Book { ...

  9. Spring JdbcTemplate 方法详解

    JdbcTemplate主要提供以下五类方法: execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句: update方法及batchUpdate方法:update方法用于执行新增.修 ...

  10. Spring中的JdbcTemplate使用

    1.引出SpringJDBC的概念 在学习JDBC编程时我们会感觉到JDBC的操作是多么繁琐,那么当我们学习的Hibernate框架时,我们感觉到数据库的操作也变非常简单,提高了开发效率.但是当使用H ...

随机推荐

  1. [ZOJ3256] Tour in the Castle

    插头DP+矩阵乘法 m喜闻乐见地达到了10^9级别..而n<=7,并且没有障碍..所以列与列之间的转移时一样的..就可以上矩乘了. 感觉自己快没救了..看半天题解还是不懂.. http://ww ...

  2. c++(线性结构的处理)

    我们知道,在内存中的空间都是连续的.也就是说,0x00000001下面的地址必然是0x00000002.所以,空间上是不会出现地址的突变的.那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以 ...

  3. Ceph部署(一)集群搭建

    背景 Ceph简介 Ceph是一个分布式存储,可以提供对象存储.块存储和文件存储,其中对象存储和块存储可以很好地和各大云平台集成.一个Ceph集群中有Monitor节点.MDS节点(可选,用于文件存储 ...

  4. [国嵌笔记][012][GCC程序编译]

    GCC特点 GCC(GUN C Compiler)是GUN推出的功能强大.性能优越的多平台编译器.其执行效率与一般编译器相比平均效率要高20%~30%. GCC基本用法 gcc [options] f ...

  5. Spark算子--SortByKey

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/076a31e7caab1316b07990c02ac65e9c.html  SortByKey--Transf ...

  6. tp5 $_ENV获取不到数据

    $_ENV变量是取决于服务器的环境变量的,从不同的服务器上获取的$_ENV变量打印出的结果可能是不同的. php的配置文件php.ini的配置项为:variables_order = "GP ...

  7. ico图标在谷歌浏览器中如何显示?

    http://www.zen-cart.cn/forum/topic266117.html 版主: shaning 发表回复 2 篇帖子 • 分页: 1 / 1  ico图标在谷歌浏览器中如何显示? ...

  8. jstl 的判断使用

    JSTL  是JSP的标准标记库 1.必须引入的头部标签 <%@ taglib uri="http://java.sun.com/jstl/core_rt"prefix=&q ...

  9. Hive字段中文注释乱码解决办法

    Hive字段中文乱码,如执行 show create table xxx 时,表级别注释.字段级别注释发现有乱码现象, 一般都是由hive 元数据库的配置不当造成的. 此时可按如下步骤进行配置调整: ...

  10. Python使用requests模块访问HTTPS网站报错`certificate verify failed`

    使用requests模块访问HTTPS网站报错: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Nam ...