• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

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

开发技术 开发技术 2周前 (05-03) 4次浏览

1、为什么要封装工具类?

  • 首先,使用Java编程是面向对象编程,面向对象有三大核心特性,其中有一大特性就是”封装”。
  • 一个项目中不可能只有一个功能模块需要对数据库进行操作,有好多功能模块都需要进行访问数据库,操作数据。
  • 在对数据库进行访问、操作、等一些步骤都是重复的,比如:注册驱动,获取连接对象,释放连接资源等等。所以,要把这些重复的代码提取,单独放到一个类中,进行封装。做成一个JDBC专用工具类,以后每次对数据库进行访问就使用该工具类。
    Java -- JDBC学习笔记4、封装工具类

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包,都需要改代码,重新编译项目。
  • 每次调用DBUtils工具类,都会创建一个新的连接对象。实际上只需一个conn对象即可。

4.1、优化方案

  • 将注册驱动使用的jar包路径和getConnection()方法中的三个参数、url、用户名、登录密码提取,放到配置文件中。
  • 对于连接对象,首次获取到的数据库连接对象conn后放到连接池中,下次获取时候,先判断连接池中是否有conn对象,如果有就直接取出使用,如果没有就创建。这样,至始至终就只用一个conn。

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;
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
  • 加载驱动,使用resourceBundel从配置文件中动态获取。
static
    {
        //加载配置文件
        resourceBundel = ResourceBundle.getBundle("jdbc");
        try
        {
            //从配置文件中获取dirver的值
            Class.forName(resourceBundel.getString("dirver"));
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
  • 获取连接对象,首先从连接池中取,如果没用再创建。
public static Connection getConnection()
    {
        //直接从连接中获取
        Connection connection = threadLocal.get();
        try
        {
            //判断是否为null
            if (connection == null)
            {
                //创建连接对象
                //里边的参数都从配置文件中读取
                connection = DriverManager.getConnection(resourceBundel.getString("url"), resourceBundel.getString("user"), resourceBundel.getString("password"));
                //方法到连接池
                threadLocal.set(connection);
            }
        }
        catch (SQLException sqlException)
        {
            sqlException.printStackTrace();
        }
        return connection;
    }

这样,不管是修改数据库还是登录密码,只需在配置文件中修改接口,无需变动Java代码。更不需要从新编译。概括来讲、就是要通过一些重构方案,降低代码的耦合度,从而提高代码的可扩展性。


程序员灯塔
转载请注明原文链接:Java — JDBC学习笔记4、封装工具类
喜欢 (0)