在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定.

在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter).

那么什么是具名参数?

具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代

具名参数只在 NamedParameterJdbcTemplate 中得到支持。

在 SQL 语句中使用具名参数时, 可以在一个 Map 中提供参数值, 参数名为键

也可以使用 SqlParameterSource 参数

批量更新时可以提供 Map 或 SqlParameterSource 的数组

现在,我们在上一篇博客文章的例子的基础上,继续编写代码:

我们在applicationContext.xml后面加入具名类对象的bean:

配置文件:

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">

class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">

之后我们不再使用上次提到的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 paramMap=new HashMap();

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);

}

运行结果:

java具名参数_Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数相关推荐

  1. JVM 学习笔记二十五、JVM监控及诊断工具-命令行篇

    二十五.JVM监控及诊断工具-命令行篇 1.概述 性能诊断是软件工程师在日常工作中经常面对和解决的问题,在用户体验至上的今天,解决好应用软件的性能问题能带来非常大的收益. Java作为最流行的编程语言 ...

  2. 《Windows核心编程》读书笔记二十五章 未处理异常,向量化异常处理与C++异常

    第二十五章  未处理异常,向量化异常处理与C++异常 本章内容 25.1 UnhandledExceptionFilter函数详解 25.2 即时调试 25.3 电子表格示例程序 25.4 向量化异常 ...

  3. 嵌入式Linux驱动笔记(二十五)------Input子系统框架

    你好!这里是风筝的博客, 欢迎和我一起交流. 一.Input子系统概述 二.Input子系统架构 三.Input子系统工作机制 3.1 核心层(input.c) 3.1.1 input_init函数 ...

  4. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  5. java沙盒模式_JavaScript学习笔记(二十五) 沙箱模式

    沙箱模式(Sandbox Pattern) 沙箱模式可以避免命名空间的一些缺点(namespacing pattern),比如: 依赖一个唯一全局的变量作为程序的全局符号.在命名空间模式中,没有办法存 ...

  6. 【Visual C++】游戏开发笔记二十五 最简化的DirectX开发环境的配置

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7672101 作者:毛星云    邮箱: h ...

  7. 【Visual C++】游戏开发笔记二十五 最简化的DirectX 11开发环境的配置

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7672101 作者:毛星云 邮箱: happ ...

  8. Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto

    目录 简介 函数 1.pem公钥内容转xml 2.pem私钥内容转xml 3.使用公钥对数据进行加密 4.使用私匙对待签名内容进行签名 示例 简介 在调用Java后端接口,需要使用后端提供的pem私钥 ...

  9. 攒机笔记二十五:台式机电脑新增内存条

    看到个大佬良心好文,转载在下面 01 什么是内存 外存(Random Access Memory,简称ROM)是只读存储器,安装软件.写文档等都要占用存储空间,硬件载体是硬盘: 内存(Read Onl ...

最新文章

  1. 和Office一起做减肥操
  2. [转载]关于Android ProGuard混淆学习记录
  3. SQL数据库无法附加 823错误修复 连接中断
  4. python下载安装教程2.7-Linux下安装python-2.7
  5. stm32 sdio acmd41 无响应。一直是返回0x3f。解决方法是清除crc错误中断
  6. bizmsg是什么文件可以删除吗_C盘里的文件夹都是什么?可以删除吗?哪些可以删除?...
  7. DL之DCGNN:基于TF利用DCGAN实现在MNIST数据集上训练生成新样本
  8. Scala Collection体系介绍
  9. [20150805]提升scn4.txt
  10. pdfplumber读取pdf简历,并且写入Excel中
  11. Gb28181之Ps流解析H264
  12. [FZYZOJ 1002] 雨天
  13. WPS Android版API
  14. SAI的操作与快捷键
  15. 如何制作一张3D复古拼贴海报 Part I
  16. bp神经网络误差反向传播,bp神经网络结果不一样
  17. windows 下安装securecrt 绿色版
  18. 快速搞懂MD5解密原理,了解常用的MD5在线解密网站
  19. uni-app 实现简单登录注册demo
  20. 去中心化云图床搭建建议:Cyberduck+4everland bucket

热门文章

  1. cli模式下php会超时吗,php cli模式下调试
  2. RT-Thread源码-__rt_ffs函数剖析
  3. 摘录魏国谋士轮胜败要素
  4. HTML--图片的插入
  5. linux运维基础-rpm包校验-rpm包安全修复-rpm覆盖
  6. Quartz入门教程
  7. 地下迷宫探索 java_Java 8:探索可能性
  8. Linux那些事儿之我是U盘(5)外面的世界很精彩
  9. Type-C口充电器头为什么没有电压输出?
  10. Hadoop集群搭建(所需软件安装包已上传发布)