这是我参与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转换为含义更丰富的异常