Spring JDBC之NamedParameterJdbcTemplate

Spring JDBC提供了兩個模板類,JdbcTemplate和NamedParameterJdbcTemplate,JdbcTemplate在給sql傳入參數,先是用?代替,在參數很少的情況下,方便識別,但在參數很多的情況下,不方便記憶與維護,使用NamedParameterJdbcTemplate,可以爲參數命名,這樣方便對參數賦值,提供程序可讀性。


1、配置文件

<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">


<!-- 指定數據源的配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>

<!--
利用 BasicDataSource配置數據源
org.apache.commons.dbcp2.BasicDataSource 需要commons-dbcp2-2.1.1.jar,依賴commons-pool2-2.4.2.jar
-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClassName" value="${jdbc.driver}"></property>
</bean>

<!-- 配置spring的jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 
配置spring的 namedParameterJdbcTemplate,支持sql語句的具名參數
namedParameterJdbcTemplate的dataSource是以構造函數參數方式配置,而不是屬性
-->

<bean id="namedParameterJdbcTemplate" 
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>
</beans>


2、TestJDBC.java

import java.util.HashMap;
import java.util.Map;


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


public class TestJDBC {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jdbcTemplate = context.getBean(JdbcTemplate.class);
NamedParameterJdbcTemplate namedParameterJdbcTemplate = context.getBean(NamedParameterJdbcTemplate.class);

@Test
public void testInsertObject() {
// 使用?來處理的話,在參數很多的情況下,需要覈對順序,容易出錯,不方便維護
String sql = "insert into student( name,age,grade,sex,email,address ) values (?,?,?,?,?,?)";

Object[] args = new Object[]{"aa", 12, 4, "男", "[email protected]", "北京"};
jdbcTemplate.update(sql, args);
}

@Test
public void testInsertObjectByName() {
String sql = "insert into student( name,age,grade,sex,email,address ) values (:name,:age,:grade,:sex,:email,:address)";

// 此處用map爲具名參數傳遞實參
// 優點:根據名稱來識別參數,可讀性較好,易於維護。
// 缺點:代碼量較多

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("name", "bb");
paramMap.put("age", 12);
paramMap.put("grade", 5);
paramMap.put("sex", "男");
paramMap.put("email", "[email protected]");
paramMap.put("address", "上海");

namedParameterJdbcTemplate.update(sql, paramMap);
}

/**
* 在具名參數的名稱與類屬性的名稱相同的情況下,可以直接傳入實體類對象
* 調用namedParameterJdbcTemplate.update(String sql, SqlParameterSource paramSource)
*/

@Test
public void testInsertObjectByClass() {
String sql = "insert into student( name,age,grade,sex,email,address ) values (:name,:age,:grade,:sex,:email,:address)";

Student student = new Student();
student.setName("cc");
student.setAge(13);
student.setGrade(5);
student.setSex("女");
student.setEmail("cc.sina.com.cn");
student.setAddress("杭州");

// 使用BeanPropertySqlParameterSource這個實現類
// 這個方法相對於update(String sql, Map<String, ?> paramMap),代碼量較小,
// 配置MVC架構使用的話,實體類對象作爲方法參數傳入,代碼更爲簡潔

SqlParameterSource paramSource = new BeanPropertySqlParameterSource(student);
namedParameterJdbcTemplate.update(sql, paramSource);
}
}

發佈了46 篇原創文章 · 獲贊 10 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章