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語句編寫錯誤的異常。