JDBC
概念: 属性文件可以帮助我们代码解耦,将一些配置信息单独提取出来,放入到属性文件中,然后使用程序去读取属性文件的内容,这样的操作可以使得配置与代码分离。
流程:
- 建议新创建一个资源文件夹
resources,并直接在该目录下创建db.properties文件。- 资源文件夹不能嵌套资源文件夹,但是可以包含
package或者folder。
- 资源文件夹不能嵌套资源文件夹,但是可以包含
- 将驱动串,连接串,账号密码等信息以
K=V的形式提取到属性文件中。 - 在
DataSource类中封装一个readPropertiesFile(),负责读取属性文件中的信息。java.util.PropertyResourceBundle类专门负责操作属性文件。static ResourceBundle getBundle(String baseName):通过属性文件名获取属性文件对象。- 参数填写属性文件的名字即可,不要添加后缀。
String getString(String key):通过key来获取属性文件中的value值。
- 在静态块中,先行调用
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);
}
}
}