JdbcTemplate
- 爲了使 JDBC 更加易於使用, Spring 在 JDBC API 上定義了一個抽象層, 以此建立一個 JDBC 存取框架.
- 作爲 Spring JDBC 框架的核心, JDBC 模板的設計目的是爲不同類型的 JDBC 操作提供模板方法. 每個模板方法都能控制整個過程, 並允許覆蓋過程中的特定任務. 通過這種方式, 可以在儘可能保留靈活性的情況下, 將數據庫存取的工作量降到最低.
1. 配置JdbcTemplate(C3P0緩衝池)
涉及架包:
// 配置Jdbc所需架包
c3p0-0.9.1.2.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
mysql-connector-java-5.1.7-bin.jar
spring-jdbc-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
1.1 添加db.properties文件
// 數據庫用戶名
jdbc.user = root
// 數據庫用戶密碼
jdbc.password = 1234
// 驅動
jdbc.driverClass = com.mysql.jdbc.Driver
// 連接URL:jdbc:mysql:/// -數據庫名
jdbc.jdbcUrl = jdbc:mysql:///spring
// 連接數
jdbc.initPoolSize=5
// 最大連接數
jdbc.maxPoolSize=10
1.2 配置xml文件
<?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:tx="http://www.springframework.org/schema/tx"
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.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 導入資源文件,
讀取db.properties文件中的數據 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置dataSource -->
<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的jdbcTemplate -->
<bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
1.3 Test測試類
package com.nchu.test;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class jdbcText {
private ApplicationContext context = null;
private JdbcTemplate jdbcTemplate;
//初始化連接池
{
context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取jdbcTemplate的bean
jdbcTemplate = (JdbcTemplate) context.getBean("jdbc");
}
//測試是否連接數據庫
@Test
public void testIsConnect() throws SQLException {
DataSource dataSource = (DataSource) context.getBean("dataSource");
System.out.println("連接成功"+dataSource.getConnection());
}
}
連接成功:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s7vFbnhx-1570362647692)(C:\Users\Leisure\AppData\Roaming\Typora\typora-user-images\1570263788168.png[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-P1v0yFKn-1570362648076)(C:\Users\Leisure\AppData\Roaming\Typora\typora-user-images\1570263914802.png)]]
2. JdbcTemplate使用
2.1 update
// 執行update
@Test
public void TestUpdate(){
String sql = "Update book set bprice=? where bid = ?";
jdbcTemplate.update(sql,222,1);
}
2.2 delete
// 執行delete
@Test
public void TestDelete(){
String sql = "delete from book where bid = ?";
jdbcTemplate.update(sql,2);
}
2.3 insert
// 執行insert
@Test
public void TestInsert(){
String sql = "Insert into book(bname,bnumber,bprice) values(?,?,?)";
jdbcTemplate.update(sql,"C++",23,23);
}
2.4 select
// query:查詢多行
@Test
public void testQueryForObject(){
String sql = "select bid,bname from book where bid> ?";
RowMapper<Book> rowMapper = new BeanPropertyRowMapper<>(Book.class);
List<Book> books = jdbcTemplate.query(sql, rowMapper,2);
System.out.println(books);
}
// queryForObject:查詢單個列的值,或做統計查詢
@Test
public void testQueryForObject2(){
String sql = "select bid from book ";
int count = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println(count);
}
2.5 batchUpate
// 執行批量更新:批量的Insert、update、delete
// 最後一個參數是Object[] 的list類型:因爲修改一條爲一個Object的數組,多條就是多個Object的數組
@Test
public void TestBatchUpdate(){
String sql = "Insert into book(bname,bnumber,bprice) values(?,?,?) ";
// jdbcTemplate.execute(sql);
List<Object[]> ls = new ArrayList<>();
ls.add(new Object[]{"C",20,18});
ls.add(new Object[]{"C",20,18});
ls.add(new Object[]{"C",20,18});
ls.add(new Object[]{"C",20,18});
ls.add(new Object[]{"C",20,18});
jdbcTemplate.batchUpdate(sql,ls);
}
補充:
// execute:不能插入參數,功能上,update與其相似
jdbcTemplate.execute(sql);
3. Jdbc中使用具名參數
- 在經典的 JDBC 用法中, SQL 參數是用佔位符 ? 表示,並且受到位置的限制. 定位參數的問題在於, 一旦參數的順序發生變化, 就必須改變參數綁定.
- 在 Spring JDBC 框架中, 綁定 SQL 參數的另一種選擇是使用具名參數(named parameter).
- 具名參數: SQL 按名稱(以冒號開頭)而不是按位置進行指定. 具名參數更易於維護, 也提升了可讀性. 具名參數由框架類在運行時用佔位符取代
- 具名參數只在 NamedParameterJdbcTemplate 中得到支持
3.1 配置xml文件
<!-- 配置namedParameterJdbcTemplate,該對象可以使用具名參數,其沒有無參構造器,所以 爲其構造器指定參數-->
<bean id="namedParameterJdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>
3.2 Test測試類
方法一:
@Test
public void TestInsert(){
// 傳統方式
// String sql = "Insert into book(bname,bnumber,bprice) values(?,?,?)";
// jdbcTemplate.update(sql,"C++",23,23);
// 使用具名參數
// 可以爲參數起名字。好處:利於後期維護;壞處:使用麻煩
// 獲取 namedParameterJdbcTemplate的bean
NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) context.getBean("namedParameterJdbcTemplate");
String sql = "Insert into book(bname,bnumber,bprice) values(:b_name,:b_number,:b_price)";
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("b_name", "English");
paramMap.put("b_number", 25);
paramMap.put("b_price", 30);
namedParameterJdbcTemplate.update(sql,paramMap);
}
方法二:
@Test
public void TestInsert2(){
// 傳統方式
// String sql = "Insert into book(bname,bnumber,bprice) values(?,?,?)";
// jdbcTemplate.update(sql,"C++",23,23);
// 使用具名參數
// 可以爲參數起名字。好處:利於後期維護;壞處:使用麻煩
String sql = "Insert into book(bname,bnumber,bprice) values(:bname,:bnumber,:bprice)";
// 使用Book對象來當載體時,具名參數要和類中參數名字一致
Book book =new Book();
book.setBname("P.E");
book.setBnumber(23);
book.setBprice(20);
// 使用BeanPropertySqlParameterSource將book類傳給paramSource
SqlParameterSource paramSource = new BeanPropertySqlParameterSource(book);
namedParameterJdbcTemplate.update(sql,paramSource);
}
``