Properties类的作用是获取配置文件以键值对存储的数据,里面保存了驱动类、url、用户名、密码和sql语句的等数据。而properties文件则是用于存放一些系统的配置信息,如:webservice地址、公共变量、数据库连接信息等,便于系统的升级维护。
一、Properties类简单应用
创建项目PropertiesDemo,新建PropertiesDemo类、PropertiesUtil类、以及userInfo.properties配置文件,项目结构如下:
*****************************************************************************************************************************************************
编辑userInfo.properties配置文件:“=”左边是键,右边是值,properties文件是以键值对的形式存储的
userName=Tom
age=20
gender=男
编写PropertiesUtil.java :里面只封装一个方法来返回数据结果
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
public class PropertiesUtil {
/**
* 功能:从userInfo.properties文件中读取出一个key对应的value
* @param 接收一个key值
* @return 返回value值
*/
public static String getValue(String keyName){
String value = "";
Properties p = new Properties();
try {
//读取jdbc.properties文件,使用InputStreamReader字符流防止文件中出现中文导致乱码
p.load(new InputStreamReader(new FileInputStream("src/userInfo.properties"),"UTF-8"));
value = p.getProperty(keyName,"获取失败");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return value;
}
}
编写PropertiesDemo:
public class PropertiesDemo {
public static void main(String[] args) {
PropertiesUtil p = new PropertiesUtil();
String userName = p.getValue("userName");
String age = p.getValue("age");
String gender = p.getValue("gender");
System.out.println("userName="+userName);
System.out.println("age="+age);
System.out.println("gender="+gender);
}
}
运行结果:main方法通过"键"3次调用getValue()方法,成功获取到了配置文件中的"值"。
需要注意的是,方法接收的keyName必须和配置文件的"键名"保持一致,否则数据获取不到。
二、Properties类获取XML文件信息(进阶)
创建项目JDBCConnection,新建JDBCConn类、以及jdbc.properties配置文件,项目结构如下:
使用Maven技术导入数据库驱动包:
右击项目--->Configure--->Convert to Maven Project
*****************************************************************************************************************************************************
转换成Maven项目后,项目多了一个文件,编辑pom.xml:
*****************************************************************************************************************************************************
在文末添加以下内容:
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
*****************************************************************************************************************************************************
此时驱动包已经下载好了:
*****************************************************************************************************************************************************
编辑jdbc.properties配置文件:
#Properties配置文件,保存通用的数据库用户名、密码等
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mashen?useSSL=false
userName=root
passWord=123
编写PropertiesUtil.java :里面只封装一个方法来返回数据结果:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
public class PropertiesUtil {
/**
* 功能:从配置文件中读取出一个key对应的value
* @param propertyName 配置文件中的key
* @return 返回一个value
*/
public static String getValue(String propertyName) {
String value = "";
Properties p = new Properties();
try {
p.load(new InputStreamReader(new FileInputStream("src/jdbc.properties"), "UTF-8"));
} catch (IOException e) {
e.printStackTrace();
}
value = p.getProperty(propertyName,"");
return value;
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class JDBCConn {
/**
* 打开数据库连接
* @param args
*/
public static Connection getConnection(){
Connection conn = null;
String driverName = PropertiesUtil.getValue("driverName");
String url = PropertiesUtil.getValue("url");
String userName = PropertiesUtil.getValue("userName");
String passWord = PropertiesUtil.getValue("passWord");
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url, userName, passWord);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 功能:从数据库获取学生数据的集合
* @param 集合
*/
public static List<Student> getStudentsList(){
List<Student> studentsList = new ArrayList<Student>();
Connection conn = getConnection();
String sql = "select * from stuInfo";
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String gender = rs.getString("gender");
Student student = new Student(id,name,age,gender);
studentsList.add(student);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return studentsList;
}
public static void main(String[] args) {
List<Student> studentsList = getStudentsList();
for (Iterator iterator = studentsList.iterator(); iterator.hasNext();) {
Student student = (Student) iterator.next();
int id = student.getId();
String name = student.getName();
int age = student.getAge();
String gender = student.getGender();
System.out.println(id+":"+name+":"+age+":"+gender);
}
}
}
创建一个students数据库,创建一张stuInfo表,写入4条数据。
创建与数据库一一对应的Student实体类:
public class Student {
private int id;
private String name;
private int age;
private String gender;
public Student(int id, String name, int age, String gender){
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
最终运行结果:
至此是否已经更理解这句话了?【properties文件则是用于存放一些系统的配置信息,如:webservice地址、公共变量、数据库连接信息等,便于系统的升级维护】?
这个实例中有一段是写sql查询语句的【String sql = "select * from stuInfo";】这样的写法非常不好,耦合性太高。如果客户频繁修改查询条件的话,改动起来非常麻烦,不易维护,如果这条sql语句足够复杂,那么就更能体会什么是耦合性太高了,牵一发而动全身!像这种sql语句也应该写入properties配置文件中。
要尽量避免直接在业务逻辑中做改动!