首页 > 学院 > 开发设计 > 正文

Properties类给你带来一点小帮助

2019-11-08 00:48:20
字体:
来源:转载
供稿:网友

PRoperties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。一个属性列表可包含另一个属性列表作为它的“默认值”;如果未能在原有的属性列表中搜索到属性键,则搜索第二个属性列表。

以下是比较常用的方法:

String getProperty(String key) //用指定的键在此属性列表中搜索属性。

String getProperty(String key,String defaultValue)//用指定的键在属性列表中搜索属性。

Object setProperty(String key, String value)//调用 Hashtable 的方法 put。

void load(InputStream inStream)//从输入流中读取属性列表(键和元素对)。

void loadFromxml(InputStreamin)//将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。

void store(OutputStream out,String comments)

//以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表

(键和元素对)写入输出流。

void storeToXML(OutputStream os,String comment,String encoding)

//使用指定的编码发出一个表示此表中包含的所有属性的 XML 文档。

下面我们通过案例来使用其中一些方法

案例1:创建一个properties文件

/**	 * 把一些属性内容保存到properties文件中	 */	public static void test1(){		Properties p=new Properties();		p.setProperty("name", "ricky");		p.setProperty("sex", "man");		p.setProperty("age","18");		try {			p.store(new FileOutputStream("msg.properties"), "this is my first properties!");		} catch (IOException e) {			e.printStackTrace();		}	}

案例2:读取一个properties文件

/**	 * 读取properties文件,并把文件中的键值输出来	 */	public static void test2() {		Properties p=new Properties();		try {			p.load(new FileInputStream("msg.properties"));			Set<Entry<Object, Object>> set=p.entrySet();			for (Iterator 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();		}	}

案例3:创建一个XML文件

/**	 * 把一些属性保存到XML文件中	 */	public static void test3() {		Properties p=new Properties();		p.setProperty("name", "kanman");		p.setProperty("sex", "woman");		p.setProperty("age","20");		try {			p.storeToXML(new FileOutputStream("msg.xml"), "this is my first XML!");		} catch (IOException e) {			e.printStackTrace();		}	}

案例4:读取一个XML文件

/**	 * 读取xml文件中的键值对	 */	public static void test4() {		Properties p=new Properties();		try {			p.loadFromXML(new FileInputStream("msg.xml"));			Set<Entry<Object, Object>> set=p.entrySet();			for (Iterator 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();		}	}

案例5:综合利用案例(通过数据库查找内容)

我们连接数据库时,需要记住ip地址,用户名,密码,还有一个驱动名称。这些都是我们连接数据库必备的数据,但

是往往我们很难记住它们,而今天我们刚好学习到properties类,我们就利用它来创建一个properties文件,然后把

连接数据库必备的数据写入这个文件中,我们再次连接时,就可以通过读取文件使用里面的数据进行连接,大大减少

我们的工作量。

jdbc.properties文件:

同样,在java中编辑SQL语句时会很麻烦,而为了今天的内容,这次我们创建个XML文件来存放要执行的SQL语句。

sql.xml文件:

这里我使用了3种执行的语句:

第一种是不带参数的语句查询

第二种是带一个参数的语句查询

第三种是带2个(多个)参数的语句查询

代码示例:(部分代码有注释)

import java.io.FileInputStream;import java.io.IOException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.Map.Entry;import java.util.Properties;import java.util.Set;public class jdbcDemo {	/**	 * 通过读取jdbc.properties来连接数据库	 * @return 返回一个数据库连接	 */	public static Connection getConnection() {		Connection conn=null;		Properties p=new Properties();		try {			p.load(new FileInputStream("jdbc.properties"));			Class.forName(p.getProperty("driverName",""));			conn=DriverManager.getConnection(p.getProperty("ip"), p.getProperty("username"), p.getProperty("passWord"));		} catch (IOException e) {			e.printStackTrace();		} catch (ClassNotFoundException e) {			e.printStackTrace();		} catch (SQLException e) {			e.printStackTrace();		}		return conn;	}	/**	 * 从XML文件中获取SQL语句	 * @param key:根据key键来获取对应的值	 * @return 返回对应的语句	 */	public static String getMsgFromXML(String key) {		Properties p=new Properties();		String msg="";		try {			p.loadFromXML(new FileInputStream("sql.xml"));			msg=p.getProperty(key);		} catch (IOException e) {			e.printStackTrace();		}		return msg;	}	/**	 * 获取一个表中的所有信息	 */	public static void getMsgFromSql() {		Connection conn=getConnection();			System.out.println("sql语句:");			System.out.println(getMsgFromXML("user.list"));			System.out.println(getMsgFromXML("user.list.byName"));			System.out.println(getMsgFromXML("user.list.byId.byName"));			System.out.println("-----------------------");			System.out.println("查询user表的所有信息");			//SQL语言是:select * from user		try {			Statement stat=conn.createStatement();			ResultSet rs=stat.executeQuery(getMsgFromXML("user.list")) ;			while(rs.next()){				String id=rs.getString("id");				String name=rs.getString("username");				String password=rs.getString("password");				System.out.println(id+" "+name+" "+password);			}		} catch (SQLException e) {			e.printStackTrace();		}	}	/**	 * 带条件的SQL查询	 * 根据username=?在数据库查找信息	 */	public static void getMsgByName(String username) {		Connection conn=getConnection();		System.out.println("带条件查询SQL语句,条件是username="+username);		String sql=getMsgFromXML("user.list.byName");		PreparedStatement ps=null;		//创建一个preparedStatement对象,这个对象是可以传入参数进去的,可以执行带参数的SQL查询		ResultSet rs=null;		try {			ps=conn.prepareStatement(sql);			//获取连接后的prepareStatement对象,并向这个对象传入要执行的SQL语句			ps.setString(1, username);			//设置第一个参数为username,可以设置多个参数			rs=ps.executeQuery();			while(rs.next()){				String id=rs.getString("id");				String name=rs.getString("username");				String password=rs.getString("password");				System.out.println(id+" "+name+" "+password);			}		} catch (SQLException e) {			e.printStackTrace();		}	}	/**	 * 带多个条件的SQL语句查询	 * 在user_msg表通过username=?和id=?来查询	 * 并用ResultSetMetaData对象,在不知道行的列数时,把所有信息输出	 * userName:人名  		id:id	 */	public static void getMsgByTableByName(String userName,String id) {		Connection conn=getConnection();		PreparedStatement ps=null;		ResultSet rs=null;		ResultSetMetaData rsmd=null;		try {			ps=conn.prepareStatement(getMsgFromXML("user.list.byId.byName"));			ps.setString(1, userName);			ps.setString(2, id);			rs=ps.executeQuery();			rsmd=rs.getMetaData();			int length=rsmd.getColumnCount();			//在不知道表的列数时,可以通过以上两行代码获取			while(rs.next()){				//如此输出,就可以不考虑列数来输出一行的所有信息				for(int i=1;i<=length;i++){					System.out.print(rs.getString(i)+" ");				}			}		} catch (SQLException e) {			e.printStackTrace();		}	}	public static void main(String[] args) {		getMsgFromSql();		System.out.println("-----------------------");		getMsgByName("candy");		System.out.println("-----------------------");		getMsgByTableByName("ricky", "1");	}}user表:

user_msg表:

查询结果:

注意:

也许有些人会跟我有相同的想法,能否设置表名为参数,然后就可以在不同的表上查询信息了。

但是博主亲生经历过后并不可以实现,然后我去百度查询后知道了原因:

在SQL语句中,表名不是参数,只有表中的元素才能成为变量,才可以设置参数。而如果在SQL语句在表名出设置?,

则编译时只会按?来执行SQL语句,然后JAVA就会抛出一个sql语句编写错误的异常。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表