Properties類給你帶來一點小幫助

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章