Spring之JDBCTemplate

376 阅读2分钟

这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战

前言:在Spring中,他还提供了对JDBC操作的类叫JDBCTemplate 类,该类是Spring对JDBC支持的核心,它提供了所有对数据库操作功能的支持。

基本概念:Spring对数据库的操作在jdbc上面做了深层次的封装,使用Spring的注入功能,可以把DataSource(数据库连接池)注册到jdbcTemplate中。

使用:

DataSource:

其主要功能是获取数据库连接,具体实现时还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口。

Spring数据访问过程:

Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template)、(回调 callback),我们来看一下Spring将数据访的一次过程。

DAO模块DAO回调
第一步:准备资源 第二步:开始事务第三步:在事务中执行
第五步:提交/回滚事务 第六步:关闭资源和处理错误第四步:返回数据

SQLExceptionTranslator

它是一个接口,如若在SQLException和org.springframework.dao.DataAccessException 之间作转换,那么必须实现次接口。

常用的数据库连接池介绍:

  • c3p0(常用)
  • dbcp
  • proxool 这边我们使用常用的c3p0。

Maven引入:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.25.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.2-pre8</version>
</dependency>

我们在src目录一下创建jdbc.properties文件,以下可以配置mysql、Sql Server以及oracle

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/my_db?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
session.map.path=mysqlcfg
hibernate.dialect=org.hibernate.dialect.MySQLDialect

#Sql Server jdbc
#jdbc.driverClassName=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://127.0.0.1:3306/my_db?characterEncoding=gbk
#jdbc.username=root
#jdbc.password=root
#session.map.path=mysqlcfg
#hibernate.dialect=org.hibernate.dialect.MySQLDialect

#oracle
#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcle
#jdbc.username=root
#jdbc.password=root
#session.map.path=oraclecfg
#hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
        
        

#SQLException,如设为0则无限期等待。单位毫秒,默认为0
cpool.checkoutTimeout=1000
#始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3
cpool.initialPoolSize=20
#最小连接数量
cpool.minPoolSize=20
#最大连接数量
cpool.maxPoolSize=150
#最大的maxStatements连接数量
#cpool.maxStatements=0
#最大语句缓存
#maxStatementsPerConnection=

#数据库链接测试语句比默认的快
cpool.preferredTestQuery="select 1"
#根据一定的时间间隔检查连接池的连接数量 单位为秒
cpool.idleConnectionTestPeriod=1800
#最大空闲时间 单位为秒
cpool.maxIdleTime=7200
#池未处于装载状态时将c3p0池所持有的连接数最小化(minPoolSize只有在与maxIdleTimeExcessConnections一起使用时才重要,否则只会被完全忽略。)
cpool.maxIdleTimeExcessConnections=1800
#当连接池用完之后一次性获取的连接数量
cpool.acquireIncrement=5

Spring 配置文件

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="autoCommitOnClose" value="true" /><!--连接关闭时默认将所有未提交的操作回滚false -->
        <!--property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/ -->
        <property name="initialPoolSize" value="${cpool.minPoolSize}" />
        <property name="minPoolSize" value="${cpool.minPoolSize}" /><!--
            连接池最小数 -->
        <property name="maxPoolSize" value="${cpool.maxPoolSize}" /><!--
            连接池最大数 -->
        <property name="maxIdleTime" value="${cpool.maxIdleTime}" />
        <property name="acquireIncrement" value="${cpool.acquireIncrement}" />
    </bean>
    <!--配置JDBC模板-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--默认必须使用数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

小结:

Spring对JDBC和ORM(对象关系映射)框架支持了简化各种持久化机制都存在的样板代码。

Spring简化数据访问方式之一就是管理数据库连接的生命周期和ORM框架的Session。

Spring能够捕获框架的特定异常并将其转换成异常体系中的非检查型异常。包括将JDBC抛出的SQLException转换为含义更丰富的异常