前言
本周学习了JDBC的知识内容,并在老师的带领下编写了其工具类Utiles,但是由于没有学习IO流以及反射的知识,本工具类仍存在一些问题,所以本文章是对该工具类部分内容的优化改进
一、目前学习的Utils类驱动模块
/**
* @author 扣肉
*/
public class DBUtils3 {
/**
* 驱动内路径
*/
private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
/**
* URL地址
*/
private static final String URL = "jdbc:mysql://localhost:3306/test";
/**
* 登录数据库服务器的账号
*/
private static final String USER = "root";
/**
* 登录数据库服务器的密码
*/
private static final String PASSWORD = "123456";
/**初始连接数*/
private static final int INIT_SIZE = 1;
/**最大活动连接数*/
private static final int MAX_ACTIVE = 5;
/**最长等待连接获取时间*/
private static final long MAX_WAIT = 5000;
/**最小闲置连接数*/
private static final int MIN_IDLE = 1;
/**声明一个数据源*/
private static DruidDataSource dataSource;
static {
createDataSource();
}
private static DruidDataSource createDataSource(){
dataSource = new DruidDataSource();
dataSource.setUrl(URL);
dataSource.setUsername(USER);
dataSource.setPassword(PASSWORD);
dataSource.setInitialSize(INIT_SIZE);
dataSource.setMaxActive(MAX_ACTIVE);
dataSource.setMaxWait(MAX_WAIT);
dataSource.setMinIdle(MIN_IDLE);
return dataSource;
}
/**
* 返回数据库连接对象
* @return
*/
public static Connection getConn() {
try {
//当连接池对象为null或者连接池对象被关闭时,重新创建连接池
if(dataSource == null||dataSource.isClosed()){
dataSource = createDataSource();
}
//返回连接
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
存在的问题:我们可以看到,这个代码的执行条件是利用连接池对本地数据库进行连接,在常量中定义了驱动、数据库URL、登陆名以及密码等,这样以来本Utils便只能用于已经定义好的数据库中的操作。如果需要更换数据库,那边要更改本类中的驱动、URL等内容,这样一来,本类的通用性便大大降低。那么,如何解决这个问题呢?
二、优化后的驱动模块
需要解决上述问题,那么我们的驱动、数据库名、密码等就不可以写死,以满足工具类的通用性,那么我们现在的需求便是:不传递参数(一旦传参就存在将参数定死的可能)。那么我们就需要在配置文件中去写好我们需要的参数值。这样之后在后序需要更改数据库的时候只需要更改配置文件中的值即可,对工具类没有丝毫的影响。
不过这样一来就需要运用到IO流和反射相关的知识:
- Properties类:该类主要用于读取Java的配置文件
- ClassLoader类:根据一个指定的类名,找到对应的Class字节码文件,然后返回这个类的class对象
- getClassLoader()方法:返回类的类加载器。
- getResource()方法:找到具有给定名称的资源。
- getPath()方法:获取URL的路径。
- getProperty(“键名”)方法:获取个配置文件中‘键’对应的‘值’
- load()方法:加载配置文件
/**
* @author 扣肉
*/
public class DBUtils4 {
/**
* 驱动内路径
*/
private static String DRIVER_CLASS;
/**
* URL地址
*/
private static String URL;
/**
* 登录数据库服务器的账号
*/
private static String USER;
/**
* 登录数据库服务器的密码
*/
private static String PASSWORD;
/**初始连接数*/
private static final int INIT_SIZE = 1;
/**最大活动连接数*/
private static final int MAX_ACTIVE = 5;
/**最长等待连接获取时间*/
private static final long MAX_WAIT = 5000;
/**最小闲置连接数*/
private static final int MIN_IDLE = 1;
/**声明一个数据源*/
private static DruidDataSource dataSource;
static {
createDataSource();
try {
//1. 创建Properties集合类。
Properties pro = new Properties();
//获取src路径下的文件的方式--->ClassLoader 类加载器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
java.net.URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
pro.load(new FileReader(path));
//3. 获取数据,赋值
URL = pro.getProperty("url");
USER = pro.getProperty("user");
PASSWORD = pro.getProperty("password");
DRIVER_CLASS = pro.getProperty("driver");
//4. 注册驱动
Class.forName(DRIVER_CLASS);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static DruidDataSource createDataSource(){
dataSource = new DruidDataSource();
dataSource.setDriverClassName(DRIVER_CLASS);
dataSource.setUrl(URL);
dataSource.setUsername(USER);
dataSource.setPassword(PASSWORD);
dataSource.setInitialSize(INIT_SIZE);
dataSource.setMaxActive(MAX_ACTIVE);
dataSource.setMaxWait(MAX_WAIT);
dataSource.setMinIdle(MIN_IDLE);
return dataSource;
}
/**
* 返回数据库连接对象
* @return
*/
public static Connection getConn() {
try {
//当连接池对象为null或者连接池对象被关闭时,重新创建连接池
if(dataSource == null||dataSource.isClosed()){
dataSource = createDataSource();
}
//返回连接
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
配置文件的编写:注意使用键值对
url=jdbc:mysql://localhost:3306/test
user=root
password=123456
driver=com.mysql.jdbc.Driver
这样一来,大大提高了工具类的通用性,以后使用该工具类操作不同数据库时,只需要更改配置文件中的信息即可。