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

相关推荐

  • Angular 4.x ngModel 双向绑定原理揭秘

    一直以来都没有去深入探究Angular,只是熟练运用。真要被问起来,很多关于angular的理论知识都回答不上来。感觉上学背书的能力已经丧失的差不多了。只能以这样的方式搜集整理出来。

    2019年7月2日
    2.0K
  • JAVA基础知识整理

    终于下定决心2020年转JAVA开发,自学之路坎坷曲折。俗话说的话,好记性不如烂笔头。如果有小伙伴们也像我一样在JAVA自学之路上徘徊,那就关注一下我的博客网站。我会不定期更新一下…

    2020年1月11日
    1.9K
  • 如何判断一个对象为数组

    使用 instanceof 操作符 原理 instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。 使用 instanceof 判断一个对象…

    2020年7月3日
    1.3K
  • Webpack入门,自定义loader

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

    2022年11月23日
    888
  • spring4.x学习之创建工程

    断断续续学习Java有两三个月了,目前还是处于入门阶段。关于java及spring那些的设计理念方面的理论知识,不花费大量精力及时间是看不懂的(至少对于我这么一个前端转后端的初学者…

    2019年3月19日
    1.9K
  • STS插件mybatis-generator安装及使用

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

    2019年12月27日
    2.4K
  • JavaWeb入门案例之用户注册

    前言 之前把Java的基础知识系统的过了一遍,目前总算可以看懂Java代码了,接下来就是要学习Java开发框架(主要是springMVC)。 下面用一个用户注册的小案例,来总结一下…

    2021年1月13日
    1.8K
  • px、em和rem实战经验

    在自适应布局或者移动端网页开发时,我们经常会用到em和rem两个长度单位。接下来我们讨论一下这两个单位和px之间的区别,以及他们的使用场景等。 px px,像素(计算机屏幕上的一个…

    2018年9月11日
    2.2K
  • Java自学之类与对象

    定义 类是由成员属性和方法组成。成员属性主要定义类的一个具体信息,实际上一个成员属性就是一个变量,而方法是一些操作的行为。类的定义基础语法如下。 一个类定义完成后并不能够被直接使用…

    2020年11月25日
    1.4K
  • JAVA学习路线之夯实基础

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

    2020年1月14日
    1.8K