一、JDBC 模板技術概述
在傳統 JDBC 開發中,開發人員需要手動處理數據庫連接(Connection
)、事務管理、語句執行(Statement
)和結果集(ResultSet
)等繁瑣操作,不僅代碼冗余度高,而且容易出錯。Spring 框架針對這一痛點,提供了持久層模板類(XxxTemplate
)來簡化開發,其中用于 JDBC 操作的核心類是JdbcTemplate
。
核心優勢
- 簡化編程:封裝了 JDBC 的底層細節,開發者只需關注 SQL 語句和業務邏輯。
- 統一接口:提供一致的增刪改查方法,避免重復編寫樣板代碼。
- 整合連接池:支持 Spring 內置連接池和第三方開源連接池(如 Druid),方便管理數據庫連接。
?二、JDBC 模板類的基礎使用
?1. 創建 Maven 工程并引入依賴
?在pom.xml
中添加以下坐標,包含 Spring 核心、JDBC 模塊、數據庫驅動及日志組件:
<dependencies><!-- Spring核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><!-- JDBC模塊 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.2.RELEASE</version></dependency><!-- 數據庫驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!-- 日志 --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><!-- 測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>
?2. 手動創建對象方式(非 Spring 管理)
?通過硬編碼方式創建連接池和JdbcTemplate
對象,適用于簡單測試場景:
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;public class Demo1 {@Testpublic void run1() {// 1. 創建Spring內置連接池DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setUsername("root");dataSource.setPassword("root");// 2. 創建JdbcTemplate并綁定連接池JdbcTemplate template = new JdbcTemplate(dataSource);// 3. 執行SQL插入操作template.update("insert into account values(null, ?, ?)", "熊大", 1000);}
}
三、使用 Spring 容器管理 JDBC 組件
?1. Spring 配置文件管理連接池和模板
通過applicationContext_jdbc.xml
將連接池和JdbcTemplate
納入 Spring 容器管理,實現解耦:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 1. 配置Spring內置連接池 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///spring_db"/><property name="username" value="root"/><property name="password" value="root"/></bean><!-- 2. 配置JdbcTemplate并注入連接池 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean></beans>
2. 基于 Spring 測試的依賴注入
通過@Autowired
自動獲取JdbcTemplate
,簡化代碼:
package com.qcbyjy.test.demo1;import com.qcbyjy.demo1.model.Account;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;//使用Spring框架來管理模板類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:applicationContext_jdbc.xml")
//@ContextConfiguration(value = "classpath:applicationContext_druid.xml")
public class Demo1_1 {@Autowiredprivate JdbcTemplate jdbcTemplate;//測試
// 插入@Testpublic void run1() {jdbcTemplate.update("INSERT into account VALUES (null,?,?)", "圈圈", 5000);}// 修改@Testpublic void run2() {jdbcTemplate.update("UPDATE account set name=?,money=? where id=?", "光頭強", 122, 7);}// 刪除@Testpublic void run3() {jdbcTemplate.update("delete from account where id=?", 7);}// 通過id查詢@Testpublic void run4() {// 使用自定義RowMapper將ResultSet映射為Java對象Account account = jdbcTemplate.queryForObject("select * from account where id=?", new BeanMapper(), 8);System.out.println(account);}//查詢所有的數據@Testpublic void run5(){List<Account> list=jdbcTemplate.query("select * from account",new BeanMapper());for (Account account:list){System.out.println(account);}}// 自定義結果映射器class BeanMapper implements RowMapper<Account> {public Account mapRow(ResultSet resultSet, int i) throwsSQLException {Account account = new Account();account.setId(resultSet.getInt("id"));account.setName(resultSet.getString("name"));account.setMoney(resultSet.getDouble("money"));return account;}}
}
四、集成開源連接池(以 Druid 為例)
1. 添加 Druid 依賴
?在pom.xml
中引入 Druid 坐標:
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>
2. 配置屬性文件(jdbc.properties
)
?將數據庫連接信息外置到配置文件,便于維護:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring_db
jdbc.username=root
jdbc.password=root
3. Spring 配置文件整合 Druid
通過<context:property-placeholder>
加載屬性文件,并替換為 Druid 連接池:
<beans ...><!-- 加載屬性文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 使用Druid連接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!-- JdbcTemplate配置不變 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>
</beans>
六、總結
核心流程
- 引入依賴:包含 Spring JDBC 模塊、數據庫驅動和連接池(如 Druid)。
- 配置連接池:通過 Spring 配置文件管理數據庫連接信息,支持內置或開源連接池。
- 注入模板類:將
JdbcTemplate
納入 Spring 容器,通過依賴注入獲取實例。 - 執行操作:利用
JdbcTemplate
的增刪改查方法,結合RowMapper
處理結果集。
最佳實踐
- 外置配置:將數據庫連接信息放入屬性文件,避免硬編碼。
- 使用開源連接池:優先選擇 Druid 等高性能連接池,提升應用性能。
- 結合 Spring 測試:通過
@RunWith
和@ContextConfiguration
簡化測試代碼。
通過以上實踐,開發者可以大幅提升 JDBC 開發效率,將更多精力聚焦于業務邏輯實現。