[外鏈圖片轉(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&serverTimezone=UTC&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,不備注拒絕添加喲)