Spring Framework 基础 第五章 Spring 配置数据源


Spring Framework 基础 —— 第五章 Spring 配置数据源


1. 数据源(连接池)的作用

  • 数据源(连接池)是为提高程序性能而出现的
  • 事先实例化数据源,初始化部分连接资源
  • 使用连接资源时从数据源中获取
  • 使用完毕后将连接资源归还给数据

常见的数据源(连接池):DBCP、C3P0、BoneCP、Druid

2. 数据源的开发步骤

  1. 导入数据源的坐标和数据库驱动坐标
  2. 创建数据源对象
  3. 设置数据库的基本连接数据
    • 驱动
    • 数据库地址
    • 用户名
    • 密码
    • 初始化连接个数
    • 最大/最小连接个数
    • ……
  4. 使用数据获取连接资源和归还资源

3. 数据源的手动创建

  1. 新建工程,然后在 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>
    
  2. 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 &#123;
        /**
         * Test creating c3p0 data source manually
         */
        @Test
        public void test1() throws Exception &#123;
            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();
        &#125;
        /**
         * Test creating druid data source manually
         */
        @Test
        public void test2() throws Exception &#123;
            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();
        &#125;
    &#125;
    
  3. src/main/resource 目录下新建数据源配置文件 jdbc.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/test
    jdbc.username=root
    jdbc.password=root
    
  4. 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 &#123;
        /**
         * Test creating c3p0 data source manually (Load properties configuration file form)
         */
        @Test
        public void test3() throws Exception &#123;
            // 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();
        &#125;
    &#125;
    

4. Spring 配置数据源

可以将 DataSource 的创建权交由 Spring 容器来完成。

  1. pom.xml 内导入 Spring 的 Maven 坐标,之后加载变更

    <dependencies>
          <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.3.8</version>
            </dependency>
    </dependencies>
    
  2. 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>
    
  3. 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 &#123;
        /**
         * Test spring container to generate c3p0 data source object
         */
        @Test
        public void test4() throws Exception &#123;
            ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
            DataSource dataSource = app.getBean(DataSource.class);
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
            connection.close();
        &#125;
    &#125;
    

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="$&#123;jdbc.driver&#125;"/>
        <property name="jdbcUrl" value="$&#123;jdbc.url&#125;"/>
        <property name="user" value="$&#123;jdbc.username&#125;"/>
        <property name="password" value="$&#123;jdbc.password&#125;"/>
    </bean>
    
</beans>

6. 知识要点(重点)

Spring 容器加载 properties 文件

<context:property-placeholder location="xx.properties"/>
<property name="" value="$&#123;key&#125;"/>


文章作者: gregPerlinLi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 gregPerlinLi !
  目录