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语句编写错误的异常。
新闻热点
疑难解答