標籤:style blog color io os ar 使用 java for
一、基礎
定義:資料庫、表、列相關資訊的描述。
何時使用:想取得對資料庫的資訊時使用。
一】資料庫中繼資料——通過DataBaseMetaData
DataBaseMetaData dbmd = conn.getDataBaseMetaData();
code:
Connection conn = C3P0Utils.getMySqlConnection(); //取得資料庫中繼資料 ———— DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData(); String driver = dbmd.getDriverName(); System.out.println("driverName : " + driver);//MySQL-AB JDBC Driver String url = dbmd.getURL(); System.out.println("url : " + url);//jdbc:mysql://127.0.0.1:3306/jdbc int level = dbmd.getDefaultTransactionIsolation();//得到事務層級,值所對應的層級可有Connectin類的欄位值來查看 System.out.println("level : " + level);//2 String productName = dbmd.getDatabaseProductName(); System.out.println("productName : " + productName);//MySQL
二】參數中繼資料——通過ParameterMetaData
ParameterMetaData pmd = pstmt.getParameterMetaData;
code:
Connection conn = C3P0Utils.getMySqlConnection(); PreparedStatement pstmt = conn.prepareStatement(SqlMapping.QUERY_INF);//SELECT * FROM jdbc.test_batch WHERE id = ? //得到參數中繼資料 ParameterMetaData pmd = pstmt.getParameterMetaData(); int cnt = pmd.getParameterCount(); System.out.println("共有" + cnt + "個參數");//公有的參數,即為SQL語句中的 ? 的個數,這裡為1個
三】結果集資料元——通過ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();
code:
String SQL = " SELECT * FROM jdbc.test_batch "; Connection conn = C3P0Utils.getMySqlConnection(); PreparedStatement pstmt = conn.prepareStatement(SQL); ResultSet rs = pstmt.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int cnt = rsmd.getColumnCount();// 結果集的個數 for (int i = 1; i <= cnt; i++) { String colName = rsmd.getColumnName(i);//取得每列的名字 System.out.println("colName = " + colName);//colName = id colName = name colName = age }
總結:
核心規律如下:
ResultSetMetaData ResultSet.getMetaData();
ParameterMetaData psmt.getMetaData();
DataBaseMetaData conn.getMetaData();
二、使用MetaData中繼資料最佳化CUD操作和R操作(封裝成工具方便使用)
一】CUD操作
code:
// CUD操作 public static int update(String sql, Object[] params) throws SQLException { Connection conn = C3P0Utils.getMySqlConnection(); PreparedStatement pstmt = conn.prepareStatement(sql);// INSERT INTO meta.user(username,salary) VALUES(?, ?) // 取得參數中繼資料 ParameterMetaData pmd = pstmt.getParameterMetaData(); // 取得參數個數 int size = pmd.getParameterCount(); // 迴圈綁定對象的值 for (int i = 0; i < size; i++) { pstmt.setObject(i + 1, params[i]); } int rows = pstmt.executeUpdate(); C3P0Utils.close(conn); return rows; }
二】R操作
code:
//R操作(要求:javaBean的名稱必須要和資料庫欄位的名稱相同) public static <T> List<T> query(String sql, Object[] params, Class clazz) throws SQLException, InstantiationException, IllegalAccessException, InvocationTargetException { Connection conn = C3P0Utils.getMySqlConnection(); List<T> list = new ArrayList<T>(); PreparedStatement pstmt = conn.prepareStatement(sql);//SELECT * FROM meta.user WHERE id = ? ParameterMetaData pmd = pstmt.getParameterMetaData(); int cnt = pmd.getParameterCount(); for(int i = 0; i < cnt; i++) { pstmt.setObject(i+1, params[i]); } ResultSet rs = pstmt.executeQuery(); while (rs.next()) { ResultSetMetaData rsmd = rs.getMetaData(); int column = rsmd.getColumnCount(); T t = (T) clazz.newInstance(); for (int i = 0; i < column; i++) { String colName = rsmd.getColumnName(i+1); BeanUtils.setProperty(t, colName, rs.getObject(colName)); } list.add(t); }
C3P0Utils.closeAll(conn, pstmt, rs);
return list;
}
MetaData中繼資料