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

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

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 是通過調用 java.sql.Connection 來管理事務, 而後者是通過 DataSource 獲取到的。通過調用連接的 commit()方法來提交事務,同樣,事務失敗則通過調用 rollback()方法進行回滾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章