博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数
阅读量:7100 次
发布时间:2019-06-28

本文共 3609 字,大约阅读时间需要 12 分钟。

hot3.png

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

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

 

那么什么是具名参数?

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

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

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

也可以使用 SqlParameterSource 参数

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

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

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

配置文件:

之后我们不再使用上次提到的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来完成曾删改操作。

运行结果:

123743_555f_1156339.jpg

不过,这种方法还是有比较麻烦的地方,我们需要在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);	}

运行结果:

124149_lpuQ_1156339.jpg

转载于:https://my.oschina.net/happyBKs/blog/497798

你可能感兴趣的文章
进程监控及管理常用命令
查看>>
echo
查看>>
Myeclise下tomcat启动报错,启动超时
查看>>
Map接口、静态导入、Collections集合工具类
查看>>
Http组件的介绍
查看>>
HDU1043、3567八数码 bfs+康托展开
查看>>
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
查看>>
蓦然回首
查看>>
[转] Meida视频加密二-Blob对象
查看>>
JavaScript 变量、函数与原型链
查看>>
saltstack Key管理工具-salt-key
查看>>
WWDC19 -224-iOS 13 Presentations 适配
查看>>
Mybatis异常There is no getter for property named 'XXX' in 'class java.lang.String'
查看>>
jQuery初始化
查看>>
[转载]Linux内存高,触发oom-killer问题解决
查看>>
帮助小白快速理解多线程
查看>>
Android系统移植与驱动开发概述
查看>>
Codeforces 432D Prefixes and Suffixes kmp
查看>>
【poj解题】1028
查看>>
免费论文查重
查看>>