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

相关推荐

  • Webpack入门,自定义loader

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

    2022年11月23日
    830
  • Spring Tools学习之JAVA开发环境搭建【windows 10】

    一直以来都想学习JAVA,但是苦于找不到门路,网上学习资料要不看不懂,要不需要金钱。 终于,迫于生活与年龄的压力,下定决心,学习JAVA。 写下此文档,记录一下自己学习JAVA之路…

    2018年12月6日
    3.0K
  • MySQL数据库入门知识点整理

    数据库基本操作 1、创建数据库语句 数据库名称有以下几点要求 不能与已存在的数据库名称相同; 由字母、数字、下划线、@、$和#符号组成; 不能以数字及$符号开头; 标识符不能使用M…

    2020年7月7日
    1.6K
  • Vue项目中实现用户登录及token验证

    在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 。 后端收到请求,验证用户名和密码,验证成功,就给…

    2019年8月8日
    5.2K
  • Angular环境搭建(Windows 10)

    目前前端开发正处于快速发展阶段,接触angular时,Angular 2刚刚发布,现在第五版也已经发布。由于刚开始没有系统的学习,导致工作中,经常捉襟见肘。现在把自己在工作中踩过的…

    2018年9月5日
    4.2K
  • MyBatis配置之typeHandler类型处理器

    typeHandler类型处理器作用 MyBatis在预处理语句(PreparedStatement)中设置一个参数时,或者从结果集(ResultSet)中取出一个值时,都会用注册…

    2022年4月20日
    1.2K
  • windows下使用Docker Desktop安装nacos与mysql,实现互通访问

    1、命令行拉取MySQL镜像 打开命令提示符,运行以下命令安装mysql 2、运行mysql镜像,启动mysql实例 3、命令行拉取nacos镜像 4、运行nacos镜像,启动na…

    2022年10月27日
    504
  • JAVA学习之多线程知识点整理

    1、什么是进程?什么是线程? 进程是一个应用程序。线程是一个进程中的执行场景或者执行单元。一个进程可以启动多个线程。进程之间内存独立不共享。同一个进程中的线程之间,堆内存和方法区内…

    2020年6月19日
    1.4K
  • 如何封装VUE组件库?

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

    2019年7月31日
    2.4K
  • Webpack入门,模块打包之CommonJS与ES6 Module的区别

    前面几篇文章分别介绍了CommonJS和ES6 Module两种形式的模块定义,这篇将介绍下两者各自的特性。 动态与静态 CommonJS与ES6 Module最本质的区别在于前者…

    2022年11月12日
    912