Java -- JDBC学习笔记4、封装工具类

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代码。更不需要从新编译。概括来讲、就是要通过一些重构方案,降低代码的耦合度,从而提高代码的可扩展性。

原文地址:https://www.cnblogs.com/dcy521/p/14729570.html