一般我们不把数据库的配置信息写死在代码中。

写好代码后,编译、调试,成功后只把输出目录中的东西(jar包、.class文件、资源文件等)拷贝到服务器上,由运维来管理。服务器上是没有源文件的(.java文件),我们我们把数据库的配置信息写死在代码中,运维就不能修改数据库的配置了,如果要换服务器、要换数据库、要改数据库的密码了,运维是改不了的,只能由我们修改源码,重新编译、部署。

通常的做法是,把配置信息写在配置文件(文本文件)中,从配置文件中加载配置信息,这样运维就可以直接修改配置了,无需改动源码。

示例:

1、项目根目录下新建文件夹resource,右键标识为资源根目录

Source Root是源码的根目录,默认为src;

Test Source Root是调试的根目录,比如JUnit调试的根目录;

Resource Root是资源文件的根目录,常用来放置配置文件,也可以放置其他资源文件,比如新建子文件夹images,下面放置图片。

2、在resource下新建文件mysql.properties,内容如下:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT
user=chy
password=abcd

3、在.java文件中获取配置信息

 //从properties文件中加载数据库配置
Properties properties = new Properties();
FileInputStream inputStream = new FileInputStream("resource/mysql.properties"); //注意路径
properties.load(inputStream); String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String pwd=properties.getProperty("password"); Class.forName(driver);
Connection connection = DriverManager.getConnection(url, user, pwd); //....

运行,效果正常。

但是,还是有问题。

FileInputStream inputStream = new FileInputStream("resource/mysql.properties"); 

这种加载资源的方式是从原项目中加载资源的,不是从部署的项目(输出目录)中加载资源的,你把部署好的项目拷给运维,运行报错:找不到这个资源文件。

实际上,你不把resource文件夹标识为资源根目录,效果也是对的。因为是从原项目中加载的资源文件。

标识为Resource Root后,运行|调试时才会把这个目录复制到输出目录(部署目录)。

正确的做法:通过反射(Class对象)来加载资源文件

InputStream inputStream = 当前类的Class对象.getResourceAsStream("/mysql.properties");  

获取当前类的Class对象,有3种方式:

(1)通过当前类的实例来获取Class对象

InputStream inputStream = this.getClass().getResourceAsStream("/mysql.properties");  //注意路径

getClass()是实例方法,只能通过对象来引用,不能通过类名来引用。

这种方式有个缺陷,因为使用的是this,所以这句代码所在的方法不能是静态的(static,类方法)。

当然,硬要写成静态方法也行:

InputStream inputStream = new test.Test().getClass().getResourceAsStream("/mysql.properties");

不使用this,而是new一个当前类的实例。

(2)通过当前类的class属性来获取Class对象

     InputStream inputStream=Test.class.getResourceAsStream("/mysql.properties");  //每个类都有class属性

(3)通过Class.forName("全类名")来获取Class对象

InputStream inputStream=Class.forName("test.Test").getResourceAsStream("/mysql.properties");  //forName()里是当前类的全类名

路径问题

可以看到,这2种写法,资源文件的路径都是/开头,路径中并没有resource文件夹。

这2种都是从输出目录(部署目录)中加载资源文件。只有标识为Resource Root的文件夹run|debug时才会拷贝到输出目录|目录,拷贝时不拷贝资源根目录resource,直接把resource下的子文件、子文件夹拷贝到输出目录中项目的根目录下,所以路径以/开头,/表示项目的根目录。

Java 使用properties配置文件加载配置的更多相关文章

  1. java的自定义配置文件统一读取配置类示例

    前言:在我们的日常编程中难免会有些我们自定义的配置,虽然Java中提供了很多的读取配置文件的方法,但是当我们需要修改配置文件的key的时候,就会发现太过散乱了,工作量也会很大,涉及的文件还很多,一不小 ...

  2. Java之JDBC 通过加载properties配置文件连接数据库

    通常情况下,我们通过JDBC连接数据库的时候,不会将数据库相关配置写死,因为到时候数据库一有改动,就要重新打包部署到服务器或者替换相关的.class文件,这样非常不灵活.因此,咱们一般会通过读取配置文 ...

  3. SpringMVC加载配置Properties文件的几种方式

    最近开发的项目使用了SpringMVC的框架,用下来感觉SpringMVC的代码实现的非常优雅,功能也非常强大, 网上介绍Controller参数绑定.URL映射的文章都很多了,写这篇博客主要总结一下 ...

  4. springboot的yaml基础语法与取值,配置类,配置文件加载优先级

    1.基本语法k:(空格)v:表示一对键值对(一个空格必须有):以空格的缩进来控制层级关系:只要是左对齐的一列数据,都是同一个层级的属性和值也是大小写敏感: server: port: 8081 pat ...

  5. SpringBoot——配置文件加载位置及外部配置加载顺序

    声明 本文部分转自:SpringBoot配置文件加载位置与优先级 正文 1. 项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者applic ...

  6. Eclipse+Tomcat实现热部署/热加载配置,修改java代码无需重启tomcat

    一.Tomcat热加载配置 Eclipse Package Explorer中找到Servers,点击你所需要运行的tomcat的config配置文件,例如 demo-config,双击该文件夹下的s ...

  7. Unity3d通用工具类之数据配置加载类-ini配置文件加载

    Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...

  8. Java 读取 .properties 配置文件的几种方式

    Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中.然而 XML 配置文件需要通过 DOM 或 SAX 方式解析,而读取 properties 配 ...

  9. SpringBoot系列之配置文件加载位置

    SpringBoot系列之配置文件加载位置 SpringBoot启动会自动扫描如下位置的application.properties或者application.yml文件作为Springboot的默认 ...

随机推荐

  1. python接口自动化框架

    接口测框架 安装教程 需要3.5及以上版本的python pip install -r requirements.txt 使用说明 运行manage.py创建项目 创建的项目在projects目录下 ...

  2. 网页网站基础入门篇: 使用Adobe Dreamweaver CS6 制作网页/网站

    咱开发网页或者网站呢,最好使用个软件,我使用的是Adobe Dreamweaver CS6 (自行下载安装) 打开软件 现在呢咱使用 html5 <!doctype html> <h ...

  3. LOJ2507 CEOI2011 Matching

    题目链接 参考了 神仙yyb的博客 现在发现kmp不仅能匹配字符串,还可以用于处理任意模式匹配中的状态,如这题中已经匹配的序列中的数的大小关系就是一种状态,使用kmp找到模式序列的每一个前缀的bord ...

  4. 何为pc值

    PC就是程序计数器,就是指挥程序从哪里执行.如果是8位机,每个存储单元存放一个字节,指令有单字节.双字节和3字节.单片机复位时,PC=0000H,而后每执行一条指令,PC根据指令的字节数增加,如图:最 ...

  5. 搭建Hadoop+Python的大数据开发环境

    实验环境 CentOS镜像为CentOS-7-x86_64-Everything-1804.iso 虚机配置 节点名称 IP地址 子网掩码 CPU/内存 磁盘 安装方式 master 192.168. ...

  6. 紧随时代的步伐--Java8特性之接口默认方法

    1.关于Java8 自从1996年Sun公司发布Java以来,Java到目前为止已经走过21个年头,每一次的升级,都是Java语言的革新,对时代发展的适应.2014年Oracle发布Java8,而据可 ...

  7. VUE:页面跳转时传递参数,及参数获取

    https://www.cnblogs.com/zhongchao666/p/9679807.html https://blog.csdn.net/mf_717714/article/details/ ...

  8. 利用ffmpeg获取视频帧

    如果要对视频帧进行处理,可以先把视频帧读取出来. sh文件代码如下: #!/usr/bin/env sh VIDEO=/home/xxx/video/ FRAMES=/home/xxx/frame/ ...

  9. 【发现】visualvm是jdk自带的一款监控工具

    visualvm是jdk自带的一款监控工具.它提供了一个可视界面,用于查看 Java 虚拟机上运行的基于 Java 技术的程序的详细信息.VisualVM 对 Java Development Kit ...

  10. 发现一个企业微信第三方应用开发的疑似BUG

    1.企业微信两个账号A(超级管理员),账号B(分级管理员),账号B具有创建应用与小程序权限.2.账号B添加一个第三方应用后(创建后能看到第三方应用),使用下图接口登录时回调的agent一直为空,3.超 ...