如何封装JDBC工具类读取properties配置文件连接数据库

思路

之前已经写过一片《封装JDBC工具类,连接MySQL数据库》,讲解了如何封装JDBC工具类。但是在实际的应用中往往是把数据库连接的相关信息写在一个配置文件中,让程序自己去读取,这样方便以后的修改。封装的方法跟之前的一样,只不过增加了读取文件的操作。总而言之,由程序读取配置文件,在程序中使用变量来存储读取出来的相关配置信息,供其他程序(代码)使用。

Java读取文件

java读取文件的两种方法:java.io和java.lang.ClassLoader

// java.io: 
File  file  =  new  File("..."); 
FileInputStream  fis  =  new  FileInputStream("..."); 
FileReader  fr  =  new  FileReader("..."); 

//ClassLoader: 
ClassLoader  loader  =  XXXClass.class.getClassLoader();  
ClassLoader  loader2  =  Thread.currentThread().getContextClassLoader(); 

URL  url  =  loader.getResource("..."); 
File  file  =  new  File(url.getFile()); 
InputStream  input  =  loader.getResourceAsStream("...");

1、使用java.io

java.io 包中的类总是根据当前用户目录来分析相对路径名,也就是说相对路径是否好使,取决于 user.dir 的值。系统属性 user.dir 是 JVM 启动的时候设置的,通常是 Java 虚拟机的调用目录,即执行 java 命令所在的目录。
对于 tomcat/jboss 容器,user.dir 是 %home/bin%/ 目录,因为这个目录就是我们启动 web 容器的地方。在 eclipse 中运行程序的时候,eclipse 会将 user.dir 的值设置为工程的根目录,用户目录可以使用 System.getProperty(“user.dir”) 来查看。所以说,使用 java.io 读取文件,无论是相对路径,还是绝对路径都不是好的做法,能不使用就不要使用(在 JavaEE 中)。

2、使用ClassLoader

Class.getResource() 有 2 种方式:绝对路径和相对路径。绝对路径以 / 开头,从 classpath 或 jar 包根目录下开始搜索;相对路径是相对当前 class 所在的目录,允许使用 .. 或 . 来定位文件。
ClassLoader.getResource() 只能使用绝对路径,而且不用以 / 开头。
这两种方式读取资源文件,不会依赖于 user.dir,也不会依赖于具体部署的环境,是推荐的做法(JavaEE)

两种方法如何选取

java.io:相对于当前用户目录的相对路径读取;注重与磁盘文件打交道或者纯 java project 中使用。虽然 ClassLoader 方式更通用,但是如果不是 javaEE 环境,要定位到 classpath 路径下去读文件是不合理的。
java.lang.ClassLoader:相对于 classpath 的相对路径读取;建议在 javaEE 环境中都使用这种方式。通常,ClassLoader 不能读取太大的文件,它适合读取 web 项目的那些配置文件,如果需要读取大文件,还是要用 IO 包下的,可以先通过 ClassLoader 获取到文件的绝对路径,然后传给 File 或者其他对象,用 io 包里的对象去读取会更好些。

封装工具类

在本文中,我们使用ClassLoader来读取配置文件。

新建配置文件

首先在工程中新建一个目录命名为resource,并将其设置为资源目录。具体操作:在新建好的resource目录上右击,选择【Mark Directory as】–>【Resources Root】。

在resource目录中新建db.properties文件,将以下内容添加在该文件中。

driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db_test?useUnicode=true&characterEncoding=utf8
user=root
password=123456

注意:在文件中不能出现空格及引号。

新建DBUtil工具类

在之后使用这个工具类时,是不需要通过实例化操作,所以我们在这个工具类中声明的变量及方法都必须是静态。因为在类中,静态的变量、方法、代码块是属于类的。

package util;

import java.io.*;
import java.sql.*;
import java.util.Properties;

public class DBUtil {
    //数据库驱动
    private static String Driver="";
    //数据库地址
    private static String url="";
    //数据库用户名
    private static String userName="";
    //数据库密码
    private static String password="";
    static {
        try {
            Properties prop=new Properties();
            // 使用ClassLoader加载properties配置文件生成对应的输入流
            InputStream is=DBUtil.class.getClassLoader().getResourceAsStream("/db.properties");
            // 使用properties对象加载输入流
            prop.load(is);
            //用getProperty方法获取key对应的value值
            Driver = prop.getProperty("driverClass");
            url = prop.getProperty("url");
            userName = prop.getProperty("user");
            password = prop.getProperty("password");
            //注册驱动
            Class.forName(Driver);
        }catch (ClassNotFoundException c){
            c.printStackTrace();
        }catch (IOException ex){
            ex.printStackTrace();
        }
    }

    //获取数据库连接
    public static Connection getConnection() {
        Connection conn = null;
        try {
          conn = DriverManager.getConnection(url,userName,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    //关闭数据库资源
    public static void release(Connection conn, Statement state, ResultSet rs) {
        /*分别按顺序关闭数据库的结果集资源,Statement 对象资源以及Connection 连接数据库对象*/
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(state!=null){
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

}

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/java-package-dbutil.html

Like (0)
Donate 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
Previous 2022年3月31日
Next 2022年4月2日

相关推荐