通過 Spring 框架如何進行JDBC操作呢?

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XS2e0fOJ-1601453488065)(https://imgkr.cn-bj.ufileos.com/50416f44-5b7e-43bb-a0c4-ee71be577c04.jpg)]

## Spring 整合 JDBC 的方式

- 添加依賴

- 編寫配置文件 db.properties

- bean.xml 配置修改

- 配置數(shù)據(jù)源

- 模板類配置

- 測試整合結(jié)果

## 案例實操

### 添加依賴

#### 數(shù)據(jù)庫驅(qū)動 jar 包

~~~ java

mysql-connector-java-5.1.25-bin.jar

~~~

#### 數(shù)據(jù)庫連接池相關(guān) jar 包

~~~ java

c3p0-0.9.5.2.jar、mchange-commons-java-0.2.11.jar

~~~

#### Spring jdbc 相關(guān) jar

~~~java

spring-jdbc-4.3.2.RELEASE.jar、spring-tx-4.3.2.RELEASE.jar

~~~

~~~ xml

<!-- spring 框架坐標(biāo)依賴添加 -->

<dependency>

<groupId>org.springframework</groupId>

? ? <artifactId>spring-context</artifactId>

? ? <version>4.3.2.RELEASE</version>

</dependency>

<!-- aop -->

<dependency>

? ? <groupId>org.aspectj</groupId>

? ? <artifactId>aspectjweaver</artifactId>

? ? <version>1.8.9</version>

</dependency>

<!-- mysql 驅(qū)動包 -->

<dependency>

? ? <groupId>mysql</groupId>

? ? <artifactId>mysql-connector-java</artifactId>

? ? <version>5.1.39</version>

</dependency>

<!-- c3p0 連接池 -->

<dependency>

? ? <groupId>c3p0</groupId>

? ? <artifactId>c3p0</artifactId>

? ? <version>0.9.1.2</version>

</dependency>

<!-- spring jdbc -->

<dependency>

? ? <groupId>org.springframework</groupId>

? ? <artifactId>spring-jdbc</artifactId>

? ? <version>4.3.2.RELEASE</version>

</dependency>

<!-- springs事務(wù) -->

<dependency>

? ? <groupId>org.springframework</groupId>

? ? <artifactId>spring-tx</artifactId>

? ? <version>4.3.2.RELEASE</version>

</dependency>

~~~

###? 配置文件db.properties

~~~ java

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/spring_jdbc?useUnicode=true&characterEncod

ing=utf8

jdbc.user=root

jdbc.password=root

mysql8版本以上

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/user?useSSL=false&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true

jdbc.user=root

jdbc.password=root

~~~

**以下為可選配置**

~~~java

initialPoolSize=20

maxPoolSize=100

minPoolSize=10

maxIdleTime=600

acquireIncrement=5

maxStatements=5

idleConnectionTestPeriod=60

~~~

### bean.xml 配置修改

**加載 properties 文件配置**

~~~ xml

<!-- 加載 properties 配置文件 -->

<context:property-placeholder location="db.properties" />

~~~

~~~ 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:context="http://www.springframework.org/schema/context"

? ? xmlns:aop="http://www.springframework.org/schema/aop"

? ? xmlns:task="http://www.springframework.org/schema/task"

? ? xsi:schemaLocation="http://www.springframework.org/schema/beans

? ? http://www.springframework.org/schema/beans/spring-beans.xsd

? ? http://www.springframework.org/schema/context

? ? http://www.springframework.org/schema/context/spring-context.xsd

? ? http://www.springframework.org/schema/aop

? ? http://www.springframework.org/schema/aop/spring-aop.xsd

? ? http://www.springframework.org/schema/task

? ? http://www.springframework.org/schema/task/spring-task.xsd">

? ? <!-- 加載properties 配置文件 -->

? ? <context:property-placeholder location="db.properties" />

? ? <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

? ? ? ? <property name="driverClass" value="${jdbc.driver}"></property>

? ? ? ? <property name="jdbcUrl" value="${jdbc.url}"></property>

? ? ? ? <property name="user" value="${jdbc.user}"></property>

? ? ? ? <property name="password" value="${jdbc.password}"></property>

? ? </bean>

? ? <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

? ? ? ? <property name="dataSource" ref="dataSource"/>

? ? </bean>

</beans>

~~~

### **配置數(shù)據(jù)源**

由于建立數(shù)據(jù)庫連接是一個非常耗時耗資源的行為,所以通過連接池預(yù)先 同數(shù)據(jù)庫建立一些連接,放在內(nèi)存中,應(yīng)用程序需要建立數(shù)據(jù)庫連接時直接到連 接池中申請一個就行,用完后再放回去。

? **C3P0** **與** **dbcp** **二選一即可**

? DBCP(DataBase connection pool),數(shù)據(jù)庫連接池。是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。單獨使用 dbcp 需要 2 個包:commons-dbcp.jar,commons-pool.jar dbcp,**沒有自動回收空閑連接的功能**.

? C3P0 是一個開源的 JDBC 連接池,它實現(xiàn)了數(shù)據(jù)源,支持 JDBC3 規(guī)范和 JDBC2 的標(biāo)準(zhǔn)擴展。目前使用它的開源項目有 Hibernate,Spring 等。**c3p0 有自動回收空閑連接功能**

**C3P0 數(shù)據(jù)源配置**

~~~ xml

<!-- 配置 c3p0 數(shù)據(jù)源 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

? ? <property name="driverClass" value="${driver}"></property>

? ? <property name="jdbcUrl" value="${url}"></property>

? ? <property name="user" value="${user}"></property>

? ? <property name="password" value="${password}"></property>

</bean>

~~~

**C3P0 其他額外配置(對應(yīng)的值在 db.properties 文件中指定)**

~~~xml

<!-- 指定連接池中保留的最大連接數(shù). Default:15-->

<property name="maxPoolSize" value="${maxPoolSize}"/>

<!-- 指定連接池中保留的最小連接數(shù)-->

<property name="minPoolSize" value="${minPoolSize}"/>

<!-- 指定連接池的初始化連接數(shù) 取值應(yīng)在 minPoolSize 與 maxPoolSize 之 間.Default:3-->

<property name="initialPoolSize" value="${initialPoolSize}"/>

<!-- 最大空閑時間,60 秒內(nèi)未使用則連接被丟棄。若為 0 則永不丟棄。 Default:0-->

<property name="maxIdleTime" value="${maxIdleTime}"/>

<!-- 當(dāng)連接池中的連接耗盡的時候 c3p0 一次同時獲取的連接數(shù). Default:3-->

<property name="acquireIncrement" value="${acquireIncrement}"/>

<!-- JDBC 的標(biāo)準(zhǔn),用以控制數(shù)據(jù)源內(nèi)加載的 PreparedStatements 數(shù)量。

但由于預(yù)緩存的statements屬于單個connection而不是整個連接池所以設(shè)置這個參數(shù)需要

考慮到多方面的因數(shù).如果 maxStatements 與 maxStatementsPerConnection 均為 0,則緩存

被關(guān)閉。Default:0-->

<property name="maxStatements" value="${maxStatements}"/>

<!-- 每 60 秒檢查所有連接池中的空閑連接.Default:0 -->

<property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"/>

~~~

**對于 dbcp 數(shù)據(jù)源配置如下:**

~~~ xml

<!-- 配置 dbcp 數(shù)據(jù)源-->

<bean id="myDataSource" class="org.apache.commons.dbcp2.BasicDataSource">

? ? <property name="driverClassName" value="${driver}" />

? ? <property name="url" value="${url}"/>

? ? <property name="username" value="${user}"/>

? ? <property name="password" value="${password}"/>

<!-- 連接池啟動時的初始值 -->

<property name="initialSize" value="1"/>

<!-- 最大空閑值.當(dāng)經(jīng)過一個高峰時間后,連接池可以慢慢將已經(jīng)用不到的連接慢慢釋放一部分,一直減少到 maxIdle 為止 -->

<property name="maxIdle" value="2"/>

<!-- 最小空閑值.當(dāng)空閑的連接數(shù)少于閥值時,連接池就會預(yù)申請一些連接,以避免洪峰來時再申請而造成的性能開銷 -->

<property name="minIdle" value="1"/>

</bean>

~~~

### 模板類配置

Spring 把 JDBC 中重復(fù)的操作建立成了一個模板類:org.springframework.jdbc.core.JdbcTemplate ,配置文件中加入

~~~xml

<!-- jdbcTemplate 配置 -->

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"></property>

</bean>

~~~

### 測試整合結(jié)果

**通過 junit 測試 jdbcTemplate bean 是否獲取到**

~~~ java

public class TestSpringJdbc {

? ? private JdbcTemplate jdbcTemplate;

? ? @Before

? ? ? ? public void init(){

? ? ? ? ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");

? ? ? ? jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");

? ? }

? ? @Test

? ? public void test() {

? ? ? ? String sql="select count(1) from account";

? ? ? ? Integer total= jdbcTemplate.queryForObject(sql, Integer.class);

? ? ? ? System.out.println("總計路數(shù):"+total);

}

}

~~~

## 擴展

### JDBC 事務(wù)

如果應(yīng)用程序中直接使用 JDBC 來進行持久化,此時使用 DataSourceTransactionManager 來處理事務(wù)邊界。為了使用 DataSourceTransactionManager,需要使用如下的 XML 將其裝配到應(yīng)用程序的上下文定義中:

~~~ xml

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

~~~

界。為了使用 DataSourceTransactionManager,需要使用如下的 XML 將其裝配到應(yīng)用程序的上下文定義中:

~~~ xml

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

~~~

實際上,DataSourceTransactionManager 是通過調(diào)用 java.sql.Connection 來管理事務(wù), 而后者是通過 DataSource 獲取到的。通過調(diào)用連接的 commit()方法來提交事務(wù),同樣,事務(wù)失敗則通過調(diào)用 rollback()方法進行回滾。

需要項目資料源碼+我們程序員小姐姐v:lezijie007(加好友時備注:B站-LT,不備注拒絕添加喲)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容