1. 程式人生 > >JavaEE之元資料

JavaEE之元資料

元資料

什麼是元資料?

一、資料庫相關的資訊:(封裝到資料庫元物件: DataBaseMetaData)
資料庫的版本
驅動程式的版本
二、引數相關的資訊:(封裝到引數元物件:ParameterMetaData)
引數數量
引數型別
三、結果相關的資訊:(封裝到結果集元物件: ResultSetMetaData)
列數量
列名稱
jdbc步驟:
1)連線資料庫,獲取Connection物件  (得到DataBaseMetaData)
2)建立Statment,預編譯sql語句 (得到ParameterMetaData)
3)設定引數
4)執行sql,返回結果集 (得到ResultSetMetaData)
5)遍歷結果集

6)關閉連線

練習:
抽取兩個通用的jdbc方法
    1)通用的修改方法(insert、update、delete)
update()  用於任何表的任何更新操作
    2)通用的查詢方法,查詢後返回List集合
find()  無論查詢什麼表,都能返回我們需要的List集合

提示:使用元資料

/**
 * jdbc的工具方法
 * @author APPle
 *
 */
public class DBUtil {
	private static ComboPooledDataSource ds = new ComboPooledDataSource();

	/**
	 * 通用的更新方法
	 * 不同更新操作的不同點:
	 * 	1)sql語句不同
	 *  2)引數列表不同
	 */
	public static void update(String sql,Object[] values){
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
			//獲取連線
			conn = ds.getConnection();
			//預編譯sql
			stmt = conn.prepareStatement(sql);
			//設定引數
			ParameterMetaData md = stmt.getParameterMetaData();
			//得到引數數量
			int count = md.getParameterCount();
			if(values!=null){
				for(int i=1;i<=count;i++){
					stmt.setObject(i, values[i-1]);
				}
			}
			//執行sql
			stmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally{
			if(stmt!=null)
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			if(conn!=null)
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
		}
		
	}
	
	/**
	 * 通用的查詢方法
	 * 不同點:
	 * 	  1)sql語句不同
	 * 	  2)引數不同
	 * 	  3)List集合中的物件不同
	 */
	public static List find(String sql,Object[] values,Class clazz){
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List list = new ArrayList();
		try {
			//獲取連線
			conn = ds.getConnection();
			//預編譯sql
			stmt = conn.prepareStatement(sql);
			//設定引數
			ParameterMetaData md = stmt.getParameterMetaData();
			int count = md.getParameterCount();
			if(values!=null){
				for(int i=1;i<=count;i++){
					stmt.setObject(i, values[i-1]);
				}
			}
			//執行sql
			rs = stmt.executeQuery();
			//得到結果集的元資料
			ResultSetMetaData rsmd = rs.getMetaData();
			//得到列資料
			int columnCount = rsmd.getColumnCount();
			//遍歷結果集
			while(rs.next()){
				//建立一個javabean物件
				Object obj = clazz.newInstance();
				//把每行的結果放入javabean物件
				//遍歷每列
				for(int i=1;i<=columnCount;i++){
					//得到列名稱
					String columnName = rsmd.getColumnName(i);
					//得到列內容
					Object value = rs.getObject(columnName);
					//把列內容賦值給javabean
					/**
					 * 約定前提: 資料庫表的欄位名稱和javabean的屬性名稱保持一致!!!!
					 */
					BeanUtils.copyProperty(obj, columnName, value);
				}
				
				//把javabean放入list集合	
				list.add(obj);
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally{
			if(stmt!=null)
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			if(conn!=null)
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
		}
	}
}