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