(转) Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数(转)
在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定.
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter).
那么什么是具名参数?
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
具名参数只在 NamedParameterJdbcTemplate 中得到支持。
在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键
也可以使用 SqlParameterSource 参数
批量更新时可以提供 Map 或 SqlParameterSource 的数组
现在,我们在上一篇博客文章的例子的基础上,继续编写代码:
我们在applicationContext.xml后面加入具名类对象的bean:
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <!-- 自动扫描的包 -->
<context:component-scan base-package="com.happBKs.spring.jdbcSpring"></context:component-scan> <!-- 导入资源文件 -->
<context:property-placeholder location="classpath:db.properties" /> <!-- 配置c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean> <!-- 配置jdbc模板类 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 配置 NamedParameterJdbcTemplate,该对象可以使用具名参数。
但它没有无参构造器,所以必须为其制定构造参数,这里指定的是出c3p0数据源
--><bean id="namedParameterJdbcTemplate"class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><constructor-arg ref="dataSource"></constructor-arg></bean></beans>
之后我们不再使用上次提到的EmployeeBean类,因为我们已经知道了Spring JDBC并不能提供像Hibernate等ORM框架那样的类属性的级联映射,所以我们把属性department改为了deptId。
package com.happBKs.spring.jdbcSpring;
public class EmployeeBean2 {
Integer id;
String lastName;
String email;
Integer deptId;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public EmployeeBean2(Integer id, String lastName, String email,
Integer deptId) {
super();
this.id = id;
this.lastName = lastName;
this.email = email;
this.deptId = deptId;
}
public EmployeeBean2() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "EmployeeBean2 [id=" + id + ", lastName=" + lastName
+ ", email=" + email + ", deptId=" + deptId + "]";
}
}
然后,我们来使用具名参数来完成我们之前提到的各种更新操作:
比如之前我们插入一个记录的写法是:
这种写法,赋值的参数没有给予具体的名称,只通过占位符?来完成占位,通过赋值参数的顺序来对应相应的参数。现在我们可以借助于org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate来帮助我们解决这个问题:
不过这里有两种方法,我们先介绍最一般的一种:
/*
* 可以为参数取名字:ln,:email,:deptid
* 优点:如果有多个参数,不用去纠结于参数的位置顺序,直接对应参数名,便于维护
* 缺点:较为麻烦
*/
@Test
public void testNamedParameterJdbcTemplate(){
//之前不适用具名参数的用法:
//String sql="insert employee(last_name,email,dept_id) values(?,?,?)";
//我们给予参数赋值必须依赖于?的顺序 // 使用具名参数的用法:
String sql="insert employee(last_name,email,dept_id) values(:ln,:email,:deptid)";
Map<String,Object> paramMap=new HashMap<String, Object>();
paramMap.put("ln", "超级无敌银河最强临时工");
paramMap.put("email", "super@qq.com");
paramMap.put("deptid", 4);
namedParameterJdbcTemplate.update(sql,paramMap);
}
这里,SQL语句中的赋值参数被用":"的形式给出,这里就是具名参数。然后我们可以通过一个Map对象,Map的key是我们的具名参数,而value则是参数的值,然后通过NamedParameterJdbcTemplate类对象的方法update来完成曾删改操作。
运行结果:

不过,这种方法还是有比较麻烦的地方,我们需要在map对象中逐一指定参数。
这时候,你可能不禁感慨,还是ORM框架好,类属属性能够自动与数据库表的字段映射。这里Spring JDBC在具名参数赋值时也考虑了类似的解决方法。
下面,我来介绍具名参数的第二种方法:
我们需要将具名参数定义为与类的属性名称一样的名字,然后,可以创建一个相应的类的对象,并调用相应属性的set方法赋值,之后,我们就调用update的另一个重载方法:
/*
* 使用具名参数时,可以使用int org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(String sql, SqlParameterSource paramSource) throws DataAccessException
方法进行更新操作:
1. SQL语句中的具名参数与类的属性名一致
2. 使用接口SqlParameterSource的BeanPropertySqlParameterSource实现类作为参数 */
@Test
public void testNamedParameterJdbcTemplate2(){
//之前不适用具名参数的用法:
//String sql="insert employee(last_name,email,dept_id) values(?,?,?)";
//我们给予参数赋值必须依赖于?的顺序 // 使用具名参数的用法:
String sql="insert employee(last_name,email,dept_id) values(:lastName,:email,:deptId)";
EmployeeBean2 e=new EmployeeBean2();
e.setLastName("haha");
e.setEmail("haha@qq.com");
e.setDeptId(4);
SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(e);
namedParameterJdbcTemplate.update(sql,sqlParameterSource);
}
运行结果:

(转) Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数(转)的更多相关文章
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- Java框架spring 学习笔记(十五):操作MySQL数据库
新建一个工程,添加对数据库的支持 下载mysql驱动包 mysql-connector-java-5.1.7-bin.jar,快捷键ctrl+alt+shift+s,添加jar包到工程 编写JdbcT ...
- Java基础学习笔记二十五 MySQL
MySQL 在dos中操作mysql 连接mysql命令: mysql -uroot -p密码 ,连接OK,会出现mysql> 对数据库的操作 创建一个库 create database 库名 ...
- Spring Security(二十五):7. Sample Applications
There are several sample web applications that are available with the project. To avoid an overly la ...
- 论文阅读笔记二十五:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPPNet CVPR2014)
论文源址:https://arxiv.org/abs/1406.4729 tensorflow相关代码:https://github.com/peace195/sppnet 摘要 深度卷积网络需要输入 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Django框架(二十五)—— Django rest_framework-路由控制与响应器
路由控制与响应器 一.路由控制 # 1.基本路由: url(r'^publish/$', views.PublishView.as_view()), # 2.半自动路径:views.PublishVi ...
- Java笔记(二十五)……其他常用API
System类 工具类全部都是静态方法 常用方法 获取系统属性信息 static PropertiesgetProperties() static StringgetProperty(String k ...
- PHP学习笔记二十五【类的继承】
<?php //定义父类 class Stu{ public $name; protected $age; protected $grade; private $address;//私有变量不会 ...
- angular学习笔记(二十五)-$http(3)-转换请求和响应格式
本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transfo ...
随机推荐
- 在集群上运行caffe程序时如何避免Out of Memory
不少同学抱怨,在集群的GPU节点上运行caffe程序时,经常出现"Out of Memory"的情况.实际上,如果我们在提交caffe程序到某个GPU节点的同时,指定该节点某个比较 ...
- 将Jquery序列化后的表单值转换成Json
From: https://segmentfault.com/a/1190000000473625 小朋友有一个表单,他想以Json的方式获取到表单的内容.小朋友尝试了以下方式. 通过$(" ...
- [SHTSC 2014] 信号增幅仪
最小覆盖圆算法.看着题解半蒙半抄的搞过去了… 主要参考以下http://blog.csdn.net/acdreamers/article/details/9406735http://blog.csdn ...
- C#实现Excel的导入导出
Excel作为日常使用工具,在开发过程中经常会用到其导入导出功能.经过一个小的练习,学习了下导入导出功能. 导出篇: 从数据库查询到所要导出的数据,以xml的形势保存下来,最后输出excel的格式,保 ...
- 【转】 Easy RadControl 之 RadGridView(Silverlight)
1.不显示第1列即列指示器(Row Indicators) 在 telerik:RadGridView中设置属性 RowIndicatorVisibility="Collapsed&qu ...
- html canvas 弹球(模仿)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python-phpbb3 (可以用python3 操作 phpbb3 论坛的模块)
python-phpbb3 2016年8月30日 04:50:48 codegay phpbb3是PHP写的开源的论坛,python-phpbb3这个项目是用python3实现很多对phpbb3论坛操 ...
- Javascript轮播 支持平滑和渐隐两种效果(可以只有两张图)
先上两种轮播效果:渐隐和移动 效果一:渐隐 1 2 3 4 效果二:移动 1 2 3 4 接下来,我们来大致说下整个轮播的思路: 一.先来看简单的,移动的,先上来一个图----移动效果图: 说明: ...
- c# txt文件的读写
在公司实习,任务不太重,总结一下c#关于txt文件的读写,以便以后有用到的时候可以查看一下.如果有写得不完整的地方还请补充 说明:本人C#水平可能初级都谈不上,高手轻喷,参考:http://www.c ...
- Spring学习笔记(1)——资源加载
<!-- 占坑,迟点补充底层原理 --> Spring支持4种资源的地址前缀 (1)从类路径中加载资源——classpath: classpath:和classpath:/是等价的,都是相 ...