话说
优化之路永不停止。上篇我们已经用Servlet全部改造了新闻(News)的CURD,这里继续改进。今天先来创建Properties文件,通过加载文件的方式来获取一些固定的值。
目录结构
Properties
Properties
1)What Properties?
properties在这里就是一个文件形式,即文件名后缀是.properties。它和我们普通的text文本区别是,里面存放的是key-value形式的内容。Java里面与之对应 有一个Properties的类,专门来处理这种文件格式。这种格式,便于获取一些固定的常量。
2)Why Properties?
代码里,有些部分表面是常量,但是在某些时候也可能改变,改变的时候,项目可能在运行,直接去代码修改,不方便;把这些常量存放到静态的.properties文件中;静态文件不参与编译的,然后读取,很科学,修改起来也方便维护(假如是运维人员的话,修改.properties文件总比修改源码好吧,万一一不小心,把代码改错了呢?)
我们在BaseDao类里面,连接MySQL时候,是这样写的:
//1、加载驱动,把加载类定义为静态语句块
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//说实话感觉卡顿的问题也没怎么解决。可能搜狗输入法还没有和捷克公司做好沟通吧。
}
//2、连接MySQL数据库 定义方法getConn()
public Connection getConn() {
String url = "jdbc:mysql://localhost:3306/news_db";
String user = "root";
String password = "119913";
try {
conn = DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
System.out.print("恭喜你,连接上了....");
return conn;
}
这里,driver、user、password都写死了的,缺乏灵活性。谁知道哪天有变动。目的是:把这些短期固定的常量配置在一个.properties文件里,然后通过类来获取里面的value,存放到代码中。后期直接维护.properties文件即可。
1、设计properties文件
idea中,创建的文件类型叫做:Resource Bundle(Eclipse、MyEclipse中是file)
为便于直接读取,文件直接创建在src目录下,因为Properties类默认就是直接从src根目录开始寻找文件的。
文件名db.properties 配置如下:
#数据库驱动
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/news_db
username=root
password=119913
2、编写类,调用方法获取.properties中的value
编写ConfigUtil类,根据.properties中的key来获取其value.
package com.hmc.jdbc.news.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* User:Meice
* 2017/10/3
*/
public class ConfigUtil {
//获取db.properties文件里面的属性值value
public void get() {
try {
//创建输入流,通过类自带的类加载器来加载源文件,返回输入流
InputStream is = this.getClass().getClassLoader().getResourceAsStream("db.properties");
//实例化Properties类
Properties pro = new Properties();
//加载输入流
pro.load(is);
//获取文件对象的属性值
String driver = pro.getProperty("driver");
System.out.println(driver);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ConfigUtil().get();
}
}
以上代码,如果我们想调用get()方法的时候,我们想获取driver、url、user、password的时候,没发根据我们想要获取的key来输出对应的value值,对吧,所以我们再次优化这段代码,带入参数和返回值。
优化如下:
package com.hmc.jdbc.news.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* User:Meice
* 2017/10/3
*/
public class ConfigUtil {
public String get(String key){
String val = null;
try {
//加载文件输入流
InputStream is = this.getClass().getClassLoader().getResourceAsStream("db.properties");
//创建Properties对象
Properties pro = new Properties();
//加载配置文件
pro.load(is);
//根据key获取value
val = pro.getProperty(key);
} catch (IOException e) {
e.printStackTrace();
}
return val;
/**
* 这里返回有两种方式,第二种直接在try catch里面返回
* return pro.getProperty(key);
* 在try catch外面在返回一个null值,也是可以的。
*/
}
public static void main(String[] args) {
//测试
String val = new ConfigUtil().get("password");
System.out.println(val);
}
}
以上代码就完美达到了要求,你在调用方法的时候,只需要明确key,就能给你返回对应的value。
3、重新改进连接MySQL数据库的参数方式
为了便于调用,我们把获取值的方法get(String key)修改为静态方法:
变化点主要是:
1)方法调整为了static
2) 加载文件输入流的时候有变化
package com.hmc.jdbc.news.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* User:Meice
* 2017/10/3
*/
public class ConfigUtil {
public static String get(String key){
String val = null;
try {
//加载文件输入流
InputStream is = ConfigUtil.class.getClassLoader().getResourceAsStream("db.properties");
//创建Properties对象
Properties pro = new Properties();
//加载配置文件
pro.load(is);
//根据key获取value
val = pro.getProperty(key);
} catch (IOException e) {
e.printStackTrace();
}
return val;
/**
* 这里返回有两种方式,第二种直接在try catch里面返回
* return pro.getProperty(key);
* 在try catch外面在返回一个null值,也是可以的。
*/
}
public static void main(String[] args) {
String val = get("password");
System.out.println(val);
}
}
之前是这么加载输入流的:
InputStream is = this.getClass().getClassLoader().getResourceAsStream("db.properties");
变化为:
InputStream is = ConfigUtil.class.getClassLoader().getResourceAsStream("db.properties");
修改连接MySQL数据库代码如下:
public class BaseDao {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//1、加载驱动,把加载类定义为静态语句块
static {
try {
Class.forName(ConfigUtil.get("driver"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//说实话感觉卡顿的问题也没怎么解决。可能搜狗输入法还没有和捷克公司做好沟通吧。
}
//2、连接MySQL数据库 定义方法getConn()
public Connection getConn() {
String url = ConfigUtil.get("url");
String user = ConfigUtil.get("user");
String password = ConfigUtil.get("password");
try {
conn = DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
e.printStackTrace();
}
System.out.print("恭喜你,连接上了....");
return conn;
}
........
}
这样,关于连接数据库的所有参数都灵活了,经过测试,News显示正常。以后只用修改.properties即可。
好了,晚安。
本文介绍了一种通过Properties文件配置数据库连接信息的方法,使代码更加灵活且易于维护。
760

被折叠的 条评论
为什么被折叠?



