如何封装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自学之抽象类与接口

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

    2020年12月7日
    1.2K
  • Spring Boot的常用注解

    未来的框架趋势是“约定大于配置”,代码的封装会更加严密。开发人员会将更多的精力放在代码的整体优化和业务逻辑上,所以注解式编程会被更加广泛地使用。那么什么是注解?Spring Boo…

    2024年8月29日
    340
  • Webpack入门,模块打包之ES6 Module

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

    2022年11月11日
    536
  • 5分钟带你入门vuex(vue状态管理)

    如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那…

    2019年11月5日
    2.0K
  • 网页布局之三栏网页宽度自适应布局

    在工作中经常遇到网页布局错乱的问题,往往引发的这种问题都是因为不同设备不同分辨率而导致。归根结底,是因为前端工程师经验不足,代码写得不够完好。以下是我总结及从网络搜集的一些网页布局…

    2018年10月8日
    2.9K
  • 前端遍历树形数据,返回满足条件的树形数据

    在一次做手机端小程序项目中,有一个机构表单项,需要在页面展示是树形层级结构,但是后端开发人员返回的数据却是一维数组,而且还要在前端做过滤筛选功能。但是在使用的手机端组件库中,却没有…

    2022年11月8日
    403
  • CSS卡片堆栈

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

    2019年12月31日
    2.0K
  • 从零开始开发vue组件库

    前言 很早之前,就有开发一套vue组件库的想法,直到现在想法依旧只是想法。汗颜啊……此篇文章将讲述如何开发vue组件库,虽然文章标题为《从零开始开发vue组件库》,实际上是从搭建v…

    2024年6月23日
    584
  • JAVA学习路线之夯实基础

    第一章 开发环境 JDK(Java SE Development Kit),Java标准版开发包,提供编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环…

    2020年1月14日
    1.6K
  • Java自学之内部类

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

    2020年12月14日
    1.4K