1、为什么要封装工具类?
- 首先,使用Java编程是面向对象编程,面向对象有三大核心特性,其中有一大特性就是"封装"。
- 一个项目中不可能只有一个功能模块需要对数据库进行操作,有好多功能模块都需要进行访问数据库,操作数据。
- 在对数据库进行访问、操作、等一些步骤都是重复的,比如:注册驱动,获取连接对象,释放连接资源等等。所以,要把这些重复的代码提取,单独放到一个类中,进行封装。做成一个JDBC专用工具类,以后每次对数据库进行访问就使用该工具类。
2、重构方案
- 将注册驱动代码写在静态代码块中,因为注册驱动只注册一次即可。
- 将获取数据库连接对象代码封装为一个方法。
- 将释放连接对象资源代码封装为一个方法。
3、具体实现
新建一个Java类,取名为DBUtils,上边是静态代码块、注册驱动,下边两个静态方法、获取连接对象和释放资源。
3.1、注册驱动
static
{
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
3.2、获取连接
public static Connection getConnection()
{
Connection conn = null;
//数据库连接字符串
String url = "jdbc:sqlserver://localhost:1433;databaseName=StudentManage";
try
{
//获取连接对象
conn = DriverManager.getConnection(url, "sa", "sql2012");
}
catch (SQLException sqlException)
{
sqlException.printStackTrace();
}
return conn;
}
3.3、释放资源
public static void closeDb(Connection conn, Statement sm, ResultSet rs)
{
try
{
if (conn != null)
{
conn.close();
}
if (sm != null)
{
sm.close();
}
if (rs != null)
{
rs.close();
}
}
catch (SQLException sqlException)
{
sqlException.printStackTrace();
}
}
- 注意、第二个参数使用的是Statement类型,这样不管是Statement还是PreparedStatement都可以接收
- 因为PreparedStatement接口继承Statement接口。
4、优化DBUtils类
以上重构方案虽然将连接数据库可重用性代码提取出来做成JDBC工具类,但是整体耦合度还是相对较高,比如、数据库连接字符串,用户名,登录密码这些值都是写死在Java类中。
- 如果需要更换数据库,将SQLserver换成MYSQL,那么就需要先修改驱动jar包和url,再重新编译项目,因为Java代码改动了,所以要重新编译。
- 同样、不管是修改url,还是用户名密码,驱动jar包,都需要改代码,重新编译项目。
4.1、优化方案
- 将注册驱动使用的jar包路径和getConnection()方法中的三个参数、url、用户名、登录密码提取,放到配置文件中。
4.2、具体实现
- 首先、在Java web项目中的src文件下新建一个配置文件,取名为:jdbc.properties。里边内容如下:
dirver = com.microsoft.sqlserver.jdbc.SQLServerDriver
url = jdbc:sqlserver://localhost:1433;databaseName=StudentManage
user = sa
passwrod = sql2012
- 在DBUtils类中定义全局静态常量ResourceBundle和连接池对象。
private static final ResourceBundle resourceBundel;
- 加载驱动,使用resourceBundel从配置文件中动态获取。
static
{
//加载配置文件
resourceBundel = ResourceBundle.getBundle("jdbc");
try
{
//从配置文件中获取dirver的值
Class.forName(resourceBundel.getString("dirver"));
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
- 获取连接对象,从配置文件中读取url、用户名、密码。
public static Connection getConnection()
{
Connection connection = null;
try
{
//创建连接对象
//里边的参数都从配置文件中读取
connection = DriverManager.getConnection(resourceBundel.getString("url"), resourceBundel.getString("user"), resourceBundel.getString("password"));
}
catch (SQLException sqlException)
{
sqlException.printStackTrace();
}
return connection;
}
这样,不管是修改数据库还是登录密码,只需在配置文件中修改即可,无需改动Java代码。更不需要从新编译。概括来讲、就是要通过一些重构方案,降低代码的耦合度,从而提高代码的可扩展性。