如何封装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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
上一篇 2022年3月31日
下一篇 2022年4月2日

相关推荐

  • Java自学之多线程编程

    多线程编程是Java语言最为重要的特性之一。利用多线程技术可以提升单位时间内的程序处理性能,也是现代程序开发中高并发的主要设计模式。 进程与线程 进程是一个应用程序。线程是一个进程…

    2020年12月16日
    1.6K
  • Java自学之内部类

    内部类是一种常见的嵌套结构,利用这样的结构使得内部类可以与外部类共存,并且方便地进行私有操作的访问。 内部类基本概念 内部类(内部定义普通类、抽象类、接口的统称)是指一种嵌套的结构…

    2020年12月14日
    1.5K
  • Webpack入门,自定义loader

    有时开发者会遇到现有loader无法很好满足需求的情况,这时就需要对其进行修改,或者编写新的loader。 下面以一个简单的示例,讲解以下如何实现一个loader。 需求 实现一个…

    2022年11月23日
    784
  • CSS卡片堆栈

    在浏览各种APP及网站,往往会发现很多酷炫的布局及样式。搜集一下,补充自己的技能库,借鉴学习一下。 HTML CSS

    2019年12月31日
    2.1K
  • Webpack入门,模块打包之ES6 Module

    JavaScript之父Brendan Eich在最初设计这门语言时,并没有包含模块的概念。基于越来越多的工程需要,为了使用模块化进行开发,JavaScript社区涌现出了多种模块…

    2022年11月11日
    601
  • Java自学之异常的捕获与处理

    在程序开发中,程序的编译与运行是两个不同的阶段,编译主要针对的是语法检测,而在程序运行时却有可能出现各种各样的错误导致程序中断执行,那么这些错误在Java中统一称为异常。 异常处理…

    2020年12月11日
    1.4K
  • STS插件mybatis-generator安装及使用

    断断续续学习Java也有好长时间了,没有师傅带,没有项目练手,学习超级慢,也很烦。视频、书籍翻看了一大推,还是没有目标。 相信滴水成海,外加条条大路通罗马,只要坚持,自己终能达成目…

    2019年12月27日
    2.3K
  • Java自学之抽象类与接口

    面向对象程序设计中,类继承的主要作用的扩充已有类的功能。子类可以根据自己的需要选择是否要覆写父类中的方法,所以一个设计完善的父类是无法对子类做出任何强制性的覆写约定。为了解决这样的…

    2020年12月7日
    1.3K
  • JavaScript基础知识八问

    JavaScript是前端开发中非常重要的一门语言,浏览器是他主要运行的地方。JavaScript是一个非常有意思的语言,但是他有很多一些概念,大家经常都会忽略。比如说,原型,闭包…

    2020年12月30日
    1.0K
  • 如何封装VUE组件库?

    之前一直在使用Angular开发项目,也封装过Angular组件。由于种种原因,现需要转战VUE。好在本人有扎实的实战经验,结合各位网络大神整理的经验,现总结一篇关于封装VUE组件…

    2019年7月31日
    2.4K