属性配置JDBC

188 阅读2分钟

JDBC

概念: 属性文件可以帮助我们代码解耦,将一些配置信息单独提取出来,放入到属性文件中,然后使用程序去读取属性文件的内容,这样的操作可以使得配置与代码分离。

流程:

  1. 建议新创建一个资源文件夹 resources,并直接在该目录下创建 db.properties 文件。
    • 资源文件夹不能嵌套资源文件夹,但是可以包含 package 或者 folder
  2. 将驱动串,连接串,账号密码等信息以 K=V 的形式提取到属性文件中。
  3. DataSource 类中封装一个 readPropertiesFile(),负责读取属性文件中的信息。
    • java.util.PropertyResourceBundle 类专门负责操作属性文件。
    • static ResourceBundle getBundle(String baseName):通过属性文件名获取属性文件对象。
      • 参数填写属性文件的名字即可,不要添加后缀。
    • String getString(String key):通过key来获取属性文件中的value值。
  4. 在静态块中,先行调用 readPropertiesFile(),将需要的信息提升到成员属性中。

如果url中的utf-8不支持,使用utf8替换。

代码

文件夹名字蓝色:resourse

  • 连接池
  • db.properties
jdbc.driver = com.mysql.jdbc.Driver
jdbc.user = wa134679
jdbc.password = wa134679
jdbc.url = jdbc:mysql://localhost:3306/dbyap?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
jdbc.connectionPoolSize = 10
package com.yap.resourse;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

/**
 * @Author Yap
 */
public class DataSource {

    private static List<Connection> connectionPool;
    private static int connectionPoolSize;
    private static String driver;
    private static String user;
    private static String password;
    private static String url;


    static {
        readPropertiesFile();
        try {
            Class.forName(driver);
            initConnectionPool();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
            /*初始化连接池*/
    public static void initConnectionPool() {
        connectionPool = new ArrayList<>();
        for (int i = 0; i < connectionPoolSize; i++) {
            connectionPool.add(createNewConnection());
        }
    }
           /*读取属性文件*/
    public static void readPropertiesFile() {
        ResourceBundle rb = PropertyResourceBundle.getBundle("db");
        driver = rb.getString("jdbc.driver");
        user = rb.getString("jdbc.user");
        password = rb.getString("jdbc.password");
        url = rb.getString("jdbc.url");
        connectionPoolSize = Integer.parseInt(rb.getString("jdbc.connectionPoolSize"));


    }
           /*创建新连接*/
    public static Connection createNewConnection() {

        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
         /*获得连接*/
    public synchronized Connection getConnection() {
        Connection connection = null;
        if (connectionPool.isEmpty()) {
            connection = createNewConnection();
        } else {
            connection = connectionPool.remove(0);
        }
        return connection;
    }
           /*关闭连接*/
    public void closeConnection(Connection connection) {
        try {
            if (connectionPool.size() < connectionPoolSize) {
                connectionPool.add(connection);
            } else {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

工厂模式:
package com.yap.factory;

/**
 * @Author Yap
 */
public class DataSourceFactory {
    public static DataSource getDataSource() {
        return new DataSource();
    }
}




测试代码;

package com.yap.resourse;

import com.yap.datesourse.DateSource;
import org.junit.Test;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * @Author Yap
 */
public class DateSourceTest {
    @Test
    public void dateSourceTest(){
        DateSource dataSource = DataSourceFactory.getDataSource();
        Connection connection = dataSource.getConnection();
        try {
            System.out.println(connection.isClosed()? "fail" : "success");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            dateSource.closeConnection(connection);
        }
    }
}