Spring Framework 基础 —— 第五章 Spring 配置数据源
1. 数据源(连接池)的作用
- 数据源(连接池)是为提高程序性能而出现的
- 事先实例化数据源,初始化部分连接资源
- 使用连接资源时从数据源中获取
- 使用完毕后将连接资源归还给数据
常见的数据源(连接池):DBCP、C3P0、BoneCP、Druid 等
2. 数据源的开发步骤
- 导入数据源的坐标和数据库驱动坐标
- 创建数据源对象
- 设置数据库的基本连接数据
- 驱动
- 数据库地址
- 用户名
- 密码
- 初始化连接个数
- 最大/最小连接个数
- ……
- 使用数据获取连接资源和归还资源
3. 数据源的手动创建
新建工程,然后在
pom.xml
内导入所需要的包的的 Maven 坐标,之后加载变更<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.23</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.2</version> </dependency> </dependencies>
在
src/test/java
目录下创建com.yourname.test.DataSourceTest
类,用于测试数据源import com.alibaba.druid.pool.DruidDataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.junit.Test; import java.sql.Connection; public class DataSourceTest { /** * Test creating c3p0 data source manually */ @Test public void test1() throws Exception { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUser("root"); dataSource.setPassword("root"); Connection connection = dataSource.getConnection(); System.out.println(connection); connection.close(); } /** * Test creating druid data source manually */ @Test public void test2() throws Exception { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); druidDataSource.setUrl("jdbc:mysql://localhost:3306/test"); druidDataSource.setUsername("root"); druidDataSource.setPassword("root"); Connection connection = druidDataSource.getConnection(); System.out.println(connection); connection.close(); } }
在
src/main/resource
目录下新建数据源配置文件jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=root
在
com.yourname.test.DataSourceTest
下测试配置文件import com.mchange.v2.c3p0.ComboPooledDataSource; import org.junit.Test; import java.sql.Connection; import java.util.ResourceBundle; public class DataSourceTest { /** * Test creating c3p0 data source manually (Load properties configuration file form) */ @Test public void test3() throws Exception { // 1.Read configuration file ResourceBundle jdbc = ResourceBundle.getBundle("jdbc"); String driver = jdbc.getString("jdbc.driver"); String url = jdbc.getString("jdbc.url"); String username = jdbc.getString("jdbc.username"); String password = jdbc.getString("jdbc.password"); // 2.Create data source object and setting connection parameters ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); dataSource.setUser(username); dataSource.setPassword(password); Connection connection = dataSource.getConnection(); System.out.println(connection); connection.close(); } }
4. Spring 配置数据源
可以将 DataSource
的创建权交由 Spring 容器来完成。
在
pom.xml
内导入 Spring 的 Maven 坐标,之后加载变更<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.8</version> </dependency> </dependencies>
在
src/main/resource
内新建一个 Spring XML 配置文件,并命名为applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/> <property name="user" value="root"/> <property name="password" value="root"/> </bean> </beans>
在
com.yourname.test.DataSourceTest
下测试配置文件import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.sql.DataSource; import java.sql.Connection; public class DataSourceTest { /** * Test spring container to generate c3p0 data source object */ @Test public void test4() throws Exception { ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); DataSource dataSource = app.getBean(DataSource.class); Connection connection = dataSource.getConnection(); System.out.println(connection); connection.close(); } }
5. 抽取 JDBC 配置文件
applicationConotext.xml
加载 jdbc.properties
配置文件获得连接信息。
首先,需引入 context 命名空间和约束路径:
命名空间:xmlns:context="http://www.springframework.org/schema/context"
约束路径:http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
示例代码:
<?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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- Load external properties file -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
6. 知识要点(重点)
Spring 容器加载 properties 文件
<context:property-placeholder location="xx.properties"/>
<property name="" value="${key}"/>