文档章节

Spring框架笔记(二十五)——NamedParameterJdbcTemplate与具名参数

HappyBKs
 HappyBKs
发布于 2015/08/27 12:42
字数 1317
阅读 5696
收藏 11

在经典的 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);
	}

运行结果:







© 著作权归作者所有

共有 人打赏支持
HappyBKs

HappyBKs

粉丝 630
博文 302
码字总数 472010
作品 0
浦东
程序员
spring--(23)具名参数

在上一篇中,jdbc的传参形式是 ?,如果参数比较多或者是参数的位置发生改变,则传参对应的位置也需要改变,十分的不方便。这篇中采用具名参数的形式传参,有效的解决了上述问题。 xml配置文...

求是科技
2016/09/04
0
0
spring NamedParameterJdbcTemplate

<!-- 配置 C3P0 数据源 --> <bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="user" value="${jdbc.user}"></property><property name="password"......

os_vc
2015/12/18
41
0
spring jdbctemplate 项目使用完整记录

一、前言 项目使用jdbctemplate已经一段时间了,对于jdbcTemplate的使用有了一些小小心得,这里总结后跟大家分享下。 二、spring xml 配置jdbcTemplate 三、通过DBColumnMapper、泛型封装添加...

漂泊者及其影子
2015/05/27
0
0
对JDBC的支持 之 7.2 JDBC模板类

JDBC模板类 概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。 JdbcTemplate类通过模...

heroShane
2014/02/27
0
0
Spring.NET学习笔记——目录(原)

目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔记2——环境搭建(基础篇) Level 200 Sprin...

长平狐
2012/06/11
887
1

没有更多内容

加载失败,请刷新页面

加载更多

区块链教程以太坊源码分析chain-indexer区块链索引一

兄弟连区块链教程以太坊源码分析chain-indexer区块链索引一 chain_indexer 区块链索引 chain_indexer.go 源码解析 chain_indexer 顾名思义, 就是用来给区块链创建索引的功能。 之前在eth协议...

兄弟连区块链入门教程
6分钟前
0
0
社会化分享插件集成分享

一.前提摘要 社会化分享每个app必备的推广需求,无论是拉新,邀请,游戏奖励,等等都离不开分享的影子,下面我们介绍下社会化分享的插件; 首先要说下,现在的社交App,社区App等,国内外的...

佳妮
7分钟前
0
0
IOC 之 Spring 统一资源加载策略

统一资源:Resource org.springframework.core.io.Resource 为 Spring 框架所有资源的抽象和访问接口 它继承 org.springframework.core.io.InputStreamSource接口 作为所有资源的统一抽象,S...

职业搬砖20年
7分钟前
0
0
Python爬虫实战入门一:工具准备

一、基础知识 使用Python编写爬虫,当然至少得了解Python基本的语法,了解: 基本数据结构 数据类型 控制流 函数的使用 模块的使用 不需要过多过深的Python知识,仅此而已。 个人推荐《Pytho...

糖宝lsh
11分钟前
0
0
Hanlp中使用纯JAVA实现CRF分词

Hanlp中使用纯JAVA实现CRF分词 与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的读取与...

左手的倒影
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部