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

極樂 .發表於2020-09-30

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

Spring 整合 JDBC 的方式

  • 新增依賴
  • 編寫配置檔案 db.properties
  • bean.xml 配置修改
  • 配置資料來源
  • 模板類配置
  • 測試整合結果

案例實操

新增依賴

資料庫驅動 jar 包

mysql-connector-java-5.1.25-bin.jar

資料庫連線池相關 jar 包

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

Spring jdbc 相關 jar

spring-jdbc-4.3.2.RELEASE.jar、spring-tx-4.3.2.RELEASE.jar
<!-- spring 框架座標依賴新增 --> 
<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 驅動包 --> 
<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事務 --> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-tx</artifactId> 
    <version>4.3.2.RELEASE</version>
</dependency>

配置檔案db.properties

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

以下為可選配置

initialPoolSize=20 
maxPoolSize=100 
minPoolSize=10 
maxIdleTime=600 
acquireIncrement=5 
maxStatements=5 
idleConnectionTestPeriod=60

bean.xml 配置修改

載入 properties 檔案配置

<!-- 載入 properties 配置檔案 --> 
<context:property-placeholder location="db.properties" />
<?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>

配置資料來源

由於建立資料庫連線是一個非常耗時耗資源的行為,所以通過連線池預先 同資料庫建立一些連線,放在記憶體中,應用程式需要建立資料庫連線時直接到連 接池中申請一個就行,用完後再放回去。

C3P0 dbcp 二選一即可

​ DBCP(DataBase connection pool),資料庫連線池。是 apache 上的一個 java 連線池專案,也是 tomcat 使用的連線池元件。單獨使用 dbcp 需要 2 個包:commons-dbcp.jar,commons-pool.jar dbcp,沒有自動回收空閒連線的功能.

​ C3P0 是一個開源的 JDBC 連線池,它實現了資料來源,支援 JDBC3 規範和 JDBC2 的標準擴充套件。目前使用它的開源專案有 Hibernate,Spring 等。c3p0 有自動回收空閒連線功能

C3P0 資料來源配置

<!-- 配置 c3p0 資料來源 -->
<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 其他額外配置(對應的值在 db.properties 檔案中指定)

<!-- 指定連線池中保留的最大連線數. Default:15--> 
<property name="maxPoolSize" value="${maxPoolSize}"/> 
<!-- 指定連線池中保留的最小連線數--> 
<property name="minPoolSize" value="${minPoolSize}"/> 
<!-- 指定連線池的初始化連線數 取值應在 minPoolSize 與 maxPoolSize 之 間.Default:3--> 
<property name="initialPoolSize" value="${initialPoolSize}"/> 
<!-- 最大空閒時間,60 秒內未使用則連線被丟棄。若為 0 則永不丟棄。 Default:0--> 
<property name="maxIdleTime" value="${maxIdleTime}"/> 
<!-- 當連線池中的連線耗盡的時候 c3p0 一次同時獲取的連線數. Default:3--> 
<property name="acquireIncrement" value="${acquireIncrement}"/> 
<!-- JDBC 的標準,用以控制資料來源內載入的 PreparedStatements 數量。
但由於預快取的statements屬於單個connection而不是整個連線池所以設定這個引數需要
考慮到多方面的因數.如果 maxStatements 與 maxStatementsPerConnection 均為 0,則快取
被關閉。Default:0--> 
<property name="maxStatements" value="${maxStatements}"/> 
<!-- 每 60 秒檢查所有連線池中的空閒連線.Default:0 --> 
<property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"/>

對於 dbcp 資料來源配置如下:

<!-- 配置 dbcp 資料來源-->
<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"/> 
	<!-- 最大空閒值.當經過一個高峰時間後,連線池可以慢慢將已經用不到的連線慢慢釋放一部分,一直減少到 maxIdle 為止 --> 
	<property name="maxIdle" value="2"/> 
	<!-- 最小空閒值.當空閒的連線數少於閥值時,連線池就會預申請一些連線,以避免洪峰來時再申請而造成的效能開銷 --> 
	<property name="minIdle" value="1"/> 
</bean>

模板類配置

Spring 把 JDBC 中重複的操作建立成了一個模板類:org.springframework.jdbc.core.JdbcTemplate ,配置檔案中加入

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

測試整合結果

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

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("總計路數:"+total);
	}
}

擴充套件

JDBC 事務

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

<bean id="transactionManager" 
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>

界。為了使用 DataSourceTransactionManager,需要使用如下的 XML 將其裝配到應用程式的上下文定義中:

<bean id="transactionManager" 
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>

實際上,DataSourceTransactionManager 是通過呼叫 java.sql.Connection 來管理事務, 而後者是通過 DataSource 獲取到的。通過呼叫連線的 commit()方法來提交事務,同樣,事務失敗則通過呼叫 rollback()方法進行回滾。
需要專案資料原始碼+我們程式設計師小姐姐v:lezijie007(加好友時備註:B站-LT,不備註拒絕新增喲)

相關文章