Properties类

Properties类

  • Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
  • Properties 类在Java中是个比较重要的类,主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置。



在线API文档

http://www.apihome.cn/api/java/Properties.html




构造方法

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 字符编码写入该流

1




可以在保存文件的时候设置一下编码

p.store(new OutputStreamWriter(new FileOutputStream("b.properties"),"UTF-8"), "this is utf-8 encoding the properties file");

2




读取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();
        }
    }

9




创建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();
        }
    }

3




读取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();
        }
    }

4




提高代码的可复用性



通常我们要提高代码的可复用性,一般会对方法进行封装


这样可以更方便的获取到对应的属性值


我这里分别创建一个jdbc.properties文件,和sql.xml文件



jdbc.properties文件用来存放连接数据库的一些相关属性

5



sql.xml文件存放一些查询数据库有关的语句

6



可复用的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", ""));
    }
}

7


可复用的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;
    }

}

8

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值