Properties类
- Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
- Properties 类在Java中是个比较重要的类,主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置。
在线API文档
构造方法
Properties() //创建一个无默认值的空属性列表。
Properties(Properties defaults) //创建一个带有指定默认值的空属性列表。
常用方法
String getProperty(String key) //用指定的键在此属性列表中搜索属性。
StringgetProperty(String key, String defaultValue) //用指定的键在属性列表中搜索属性。
Object setProperty(String key, String value) //调用 Hashtable 的方法 put。
void load(InputStream inStream) //从输入流中读取属性列表(键和元素对)。
void loadFromXML(InputStream in) //将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。
void store(OutputStream out, String comments) //以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。
void storeToXML(OutputStream os, String comment, String encoding) //使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。
创建properties文件
/**
* 使用Properties类把我们的属性保存一个properties文件
*/
public static void test1(){
Properties p = new Properties();
p.setProperty("姓名", "LingDu");
p.setProperty("性别", "男");
p.setProperty("年龄", "18");
try {
p.store(new FileOutputStream("a.properties"), "this is frist properties file");
} catch (IOException e) {
e.printStackTrace();
}
}
在保存properties文件的时候默认使用 ISO 8859-1 字符编码写入该流
可以在保存文件的时候设置一下编码
p.store(new OutputStreamWriter(new FileOutputStream("b.properties"),"UTF-8"), "this is utf-8 encoding the properties file");
读取properties文件
/**
* 使用Properties类读取properties文件
*/
public static void test2(){
Properties p = new Properties();
try {
//读取properties文件,拿到键值对
p.load(new InputStreamReader(new FileInputStream("a.properties")));
Set<Entry<Object,Object>> set = p.entrySet();
for (Iterator<Entry<Object, Object>> iterator = set.iterator(); iterator.hasNext();) {
Entry<Object, Object> entry = (Entry<Object, Object>) iterator.next();
System.out.println(entry.getKey() + "=" + entry.getValue());
}
} catch (IOException e) {
e.printStackTrace();
}
}
创建XML文件
/**
* 使用Properties类把我们的属性保存一个XML文件
*/
public static void test3(){
Properties p = new Properties();
p.setProperty("姓名", "LingDu");
p.setProperty("性别", "男");
p.setProperty("年龄", "18");
try {
p.storeToXML(new FileOutputStream("a.xml"), "this is frist xml file");
} catch (IOException e) {
e.printStackTrace();
}
}
读取XML文件
/**
* 从XML文件中读取数据
*/
public static void test4(){
Properties p = new Properties();
try {
p.loadFromXML(new FileInputStream("a.xml"));
//将读取的姓名输出
System.out.println(p.getProperty("姓名"));
} catch (IOException e) {
e.printStackTrace();
}
}
提高代码的可复用性
通常我们要提高代码的可复用性,一般会对方法进行封装
这样可以更方便的获取到对应的属性值
我这里分别创建一个jdbc.properties文件
,和sql.xml文件
jdbc.properties文件用来存放连接数据库的一些相关属性
sql.xml文件存放一些查询数据库有关的语句
可复用的PropertiesUtil
工具类
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
/**
* 读取属性文件相关的类
* 将方法进行封装
* @author LingDu
*/
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();
}
//使用带默认值的方法,如果没找到对应的key,则赋值一个空字符串
value = p.getProperty(propertyName,"");
return value;
}
/**
* 功能:从XML文件中读取对应的value值
* @param propertyName 配置文件中的key
* @return 返回一个value
*/
public static String getValueFromXml(String propertyName){
String value = "";
Properties p = new Properties();
try {
p.loadFromXML(new FileInputStream("src/sql.xml"));
} catch (IOException e) {
e.printStackTrace();
}
value = p.getProperty(propertyName,"");
return value;
}
public static void main(String[] args){
//输出key为"driverName" 的value值
System.out.println(PropertiesUtil.getValue("driverName"));
//输出key为"user.list" 的value值 , 后面的方法作用是 替换掉/r/n
System.out.println(PropertiesUtil.getValueFromXml("user.list").replace("/r", "").replace("/n", ""));
}
}
可复用的sql
工具类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* 2017-2-18
* 从配置文件中动态加载SQL语句
* @author LingDu
*/
public class JdbcDemo {
/**
* 获取一个数据库的连接
* 通过去PropertiesUtil工具类去读取src下的jdbc.properties文件
* @return 返回一个连接
*/
public static Connection getConnection(){
String driverName = PropertiesUtil.getValue("driverName");
String url = PropertiesUtil.getValue("url");
String username = PropertiesUtil.getValue("username");
String password = PropertiesUtil.getValue("password");
Connection conn = null;
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url,username,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 功能:从数据库获取一个用户数据的集合
* @return 对象集合
*/
public static List<User> getUserList(){
List<User> userList = new ArrayList<User>();
Connection conn = getConnection();
String sql = PropertiesUtil.getValueFromXml("user.list");
System.out.println("读取到xml中的sql语句:" + sql + "\n");
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("username");
User user = new User(id,name);
userList.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return userList;
}
/**
* 带条件的SQL查询
* 功能:从数据库获取一个指定名字的数据集合
* @return 对象集合
*/
public static List<User> getUserListByName(String name){
List<User> userList = new ArrayList<User>();
Connection conn = getConnection();
String sql = PropertiesUtil.getValueFromXml("user.list.byName");
System.out.println("读取到xml中的sql语句:" + sql + "\n");
//创建一个预编译的PreparedStatement对象
PreparedStatement ps = null;
ResultSet rs = null;
try {
//prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
ps = conn.prepareStatement(sql);
//select * from tb_user where username=? 设置到第一个参数 '?'
ps.setString(1, name);
//执行查询语句
rs = ps.executeQuery();
while(rs.next()){
User user = new User(rs.getInt("id"),rs.getString("username"));
userList.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return userList;
}
public static void main(String[] args){
Connection conn = getConnection();
if(conn != null){
System.out.println("数据库已连接");
}
System.out.println("-----------------------------\n");
//获取到所有的用户数据
List<User> userList = getUserList();
for (User user : userList) {
System.out.println("id=" + user.getId() + ",username=" + user.getUserName());
}
System.out.println("-----------------------------\n");
//传入用户名获取指定用户名的数据
List<User> userListByName = getUserListByName("lingdu");
for (User user : userListByName) {
System.out.println("id=" + user.getId() + ",username=" + user.getUserName());
}
}
}
/**
* JavaBean
* 存放User表中相关字段
* @author LingDu
*/
class User{
private int id;
private String userName;
public User(int id, String userName) {
super();
this.id = id;
this.userName = userName;
}
public User(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}