如何經過 Spring 框架進行JDBC操做?

經過 Spring 框架如何進行JDBC操做呢?

Spring 整合 JDBC 的方式

  • 添加依賴
  • 編寫配置文件 db.properties
  • bean.xml 配置修改
  • 配置數據源
  • 模板類配置
  • 測試整合結果

案例實操

添加依賴

數據庫驅動 jar 包

mysql-connector-java-5.1.25-bin.jarjava

數據庫鏈接池相關 jar 包

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

Spring jdbc 相關 jar

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

<!-- 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>sql

配置文件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&serverTimezone=UTC&allowPublicKeyRetrieval=true
jdbc.user=root
jdbc.password=root數據庫

如下爲可選配置apache

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

bean.xml 配置修改

加載 properties 文件配置tomcat

<!-- 加載 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.or...
http://www.springframework.or...
http://www.springframework.or...
http://www.springframework.or...
http://www.springframework.or...
http://www.springframework.or...
http://www.springframework.or...d">
<!-- 加載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()方法進行回滾。

相關文章
相關標籤/搜索