JDBC工具类的进化史

本文旨在讲述jdbc工具类的进化历史,即用于自我学习记忆,也方便与网友交流,若有不对的地方,也烦请指正
本文所有用到的jar包都会放在CSDN下载区,方便下载 链接:https://download.csdn.net/download/u013781343/10358284

首先我们来看下v1.0版本的jdbc工具类
在编写代码之前还需引入相关jar包,如下图
jdbc相关jarbao

注意:代码中的Connection类 为 java.sql包下的接口
java.sql

v1.0版代码如下

public class BlogJDBCUtils {
    private static Connection conn;
    public static Connection getConnection(){
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //链接地址 
            String url ="jdbc:mysql://127.0.0.1:3306/javadb";
            //用户名
            String user = "user";
            //密码
            String password = "password";
            conn = DriverManager.getConnection(url, user, password);

        } catch (Exception e) {
            System.out.println("连接数据库出错");
            e.printStackTrace();
        }
        return conn;
    }
}

然后通过v1.0的代码,我们发现以下几个问题
1. 这个jdbc工具类 没有提供关闭资源句柄的方法,差评!
2. 该工具类在获取数据库连接时,连接一次注册一次数据库驱动,耗费资源,差评!!
3. 代码中出现了硬编码,连接地址,用户名,密码都写死在代码里,不利于以后的维护,差评!!!
针对以上三个问题,我们进行第二轮升级,暂且称为v1.5版本

在v1.5的版本中,我们将代码中写死的配置项抽取出来,写在单独的dbconfig.properties文件中
这里写图片描述
具体配置项如下
这里写图片描述

同时在v1.5版本使用 静态代码块完成配置信息的加载,保证在代码被加载到虚拟机中后,只加载一次,不会因为每次调用jdbc工具类都会加载
v1.5版本代码如下

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @desc:jdbcmysql
 * @createTime: 2018年4月17日 下午5:34:11
 * @version: v1.5
 */
public class BlogJDBCUtils {
    private static String url = "";
    private static String driver = "";
    private static String user = "";
    private static String password = "";
    // 静态代码块加载配置
    static {
        // 获取properties配置
        Properties pro = new Properties();
        try {
            InputStream in = BlogJDBCUtils.class.getClassLoader().getResourceAsStream("dbconfig.properties");
            pro.load(in);
            driver = pro.getProperty("driverClassName");
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            // 加载驱动
            Class.forName(driver);
        } catch (Exception e) {
            System.out.println("读取加载文件时出错");
            e.printStackTrace();
        }
    }

    // 获得连接
    public static Connection getConnection() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            System.out.println("连接数据库出错");
            e.printStackTrace();
        }
        return conn;
    }

    // 关闭资源句柄,依次按照 res sta conn的顺序关闭
    public static void close(Connection conn, Statement sta, ResultSet res) {
        if (res != null) {
            try {
                res.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (sta != null) {
            try {
                sta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

但是,这样的工具类只是完成了初步的链接数据库功能,当网站用户访问量增加时,连接资源句柄频繁的获取与销毁,极大的耗费资源,为了解决该问题,我们可以在使用连接池,比较常见的连接池有 C3P0 DBCP 。
详情见文 DBCP C3P0连接池的使用

猜你喜欢

转载自blog.csdn.net/u013781343/article/details/79915760
今日推荐