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语句编写错误的异常。