在JDBC模板中使用具名参数

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

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

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

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

二:代码实现

1.配置NamedParameterJdbcTemplate,该对象可以使用具名参数, 其没有无参的构造器,所以必须为其构造器指定参数

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
		
		<!--自动扫描的包  -->
		<context:component-scan base-package="com.dhx.spring.jdbc"></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>
		
		<!-- 配置Spring的JDBC模板 -->
		<bean id="jdbcTemplate"
			class="org.springframework.jdbc.core.JdbcTemplate">
			<property name="dataSource" ref="dataSource"></property>
		</bean>
		
		<!--配置NamedParameterJdbcTemplate,该对象可以使用具名参数, 其没有无参的构造器,所以必须为其构造器指定参数 -->
		<bean id="namedParameterJdbcTemplate"
		class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
			<constructor-arg ref="dataSource"></constructor-arg>
		</bean>
		
</beans>

2.创建JDBCTest

package com.dhx.spring.jdbc;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

class JDBCTest {
	
	private ApplicationContext ctx=null;
	private JdbcTemplate jdbcTemplate=null;
	private EmployeeDao employeeDao=null;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate=null;
	{
		ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
		jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
		employeeDao=(EmployeeDao) ctx.getBean(EmployeeDao.class);
		namedParameterJdbcTemplate=ctx.getBean(NamedParameterJdbcTemplate.class);
	}
	/*
	 * 使用具名参数时,可以使用update(String sql, SqlParameterSource paramSource)方法进行更新操作
	 * 1.SQl语句中的参数名与类属性一致
	 * 2.使用SqlParameterSource的BeanPropertySqlParameterSource实现类作为参数
	 */
	@Test
	void testNamedParameterJdbcTemplate2() {
		String sql="insert into employee(last_name,email,depi_id) values(:lastName,:email,:depatId)";
		Employee employee=new Employee();
		employee.setLastName("adc");
		employee.setEmail("abc@qq.com");
		employee.setDepatId(2);
		SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);
		namedParameterJdbcTemplate.update(sql, paramSource);
	}
	
	/**
 * 可以为参数取名字
 * 1.好处:若有多个参数,则不用再去对应位置,直接对接参数名,便于维护
 * 2.坏处:较为麻烦。
 */
	@Test
	void testNamedParameterJdbcTemplate() {
		String sql="insert into employee(last_name,email,depi_id) values(:ln,:email,:depiid)";
		Map<String,Object> paramMap=new HashMap<>();
		paramMap.put("ln", "xyz");
		paramMap.put("email", "xyz@qq.com");
		paramMap.put("depiid", 3);
		namedParameterJdbcTemplate.update(sql, paramMap);
	}
	

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值