整理一下自己的筆記,關於Annotation註解的一個小案例。 Annotation註解: 1.首先,我們定義annotation,關聯數據庫每一張表中的字段,數據在讀取時自動匹配對應的實體中的屬性。這我們就不用在考慮加載數據是表中字段是否與實體中的屬性匹配了。 package org.apath.com.common; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /*** * 註解--數據庫字段與實體類字段 * @author Dawn * @author 2010-04-15 */ @Target({ElementType.METHOD,ElementType.FIELD}) //表示這個註解是放在方法上的 @Retention(RetentionPolicy.RUNTIME) // 表示着個方法是在運行時反射出來 public @interface ColumnAnnotation { //列名 註解的屬性 String columnName(); } //end annotation 2.下面是一個實體,在實體的每個getter方法上注入我的annotation,標誌從這裏開始。 package org.apath.com.entity; import org.apath.com.common.ColumnAnnotation; /** * 存放用戶基本信息類 * @author Dawn * @author 2010-04-14 */ public class UserInfo { private int userId; //用戶Id private String userName; //真實姓名 private String passWord; //密碼 private int departId; //所在部門 private int gender; //性別 private int roleId; //用戶角色 private int userStateId; //用戶狀態 private String face;//用戶圖像 public String getFace() { return face; } @ColumnAnnotation(columnName="face") public void setFace(String face) { this.face = face; } public int getUserStateId() { return userStateId; } @ColumnAnnotation(columnName="userStateId") public void setUserStateId(int userStateId) { this.userStateId = userStateId; } public int getUserId() { return userId; } @ColumnAnnotation(columnName="userId") public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } @ColumnAnnotation(columnName="userName") public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } @ColumnAnnotation(columnName="passWord") public void setPassWord(String passWord) { this.passWord = passWord; } public int getDepartId() { return departId; } @ColumnAnnotation(columnName="departId") public void setDepartId(int departId) { this.departId = departId; } public int getGender() { return gender; } @ColumnAnnotation(columnName="gender") public void setGender(int gender) { this.gender = gender; } public int getRoleId() { return roleId; } @ColumnAnnotation(columnName="roleId") public void setRoleId(int roleId) { this.roleId = roleId; } } //end Entity 3.獲取數據庫驅動 package org.apath.com.common; import java.sql.*; /*** * 連接驅動 * @author Dawn * @author 2010-04-14 */ public class GetDriver { static Connection conncetion=null; static ResultSet rs=null; static PreparedStatement pstmt=null; //單線程模式 static ThreadLocal thread = new ThreadLocal(); public static ThreadLocal getThread() { return thread; } static { try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConncetion() throws Exception { conncetion=(Connection)thread.get(); if(conncetion==null) { conncetion=DriverManager.getConnection("jdbc:sqlserver://localhost:1434;databaseName=HR_DB","sa","sa"); }else { thread.set(conncetion); } return conncetion; } /*** * 關閉數據庫 */ public void getClose() { conncetion=(Connection)thread.get(); try{ if(rs!=null) rs.close(); if(pstmt!=null) pstmt.close(); if(conncetion!=null) conncetion.close(); }catch(Exception ex){ ex.printStackTrace(); } //刪除 thread.remove(); } } //end 獲取數據庫驅動 4.反射獲取表中的數據 package org.apath.com.common; import java.lang.reflect.Method; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apath.com.entity.MeetingInfo; import org.apath.com.entity.Schedule; /** * 執行查詢對象操作 * * @param Sql * ,Class * @throws Exception */ public class DBConnection extends GetDriver { /** * 執行查詢對象操作 * * @param Sql * ,Class * @throws Exception */ public Object executeQuery(String sql, Class clz) throws Exception { List list = null; try { rs =executeQuerys(sql); // 得到所有的列的名稱 String[] columStrings = getColumnsName(rs); // 得到類所有的方法 Method[] methods = clz.getDeclaredMethods(); Object object = null; list=new ArrayList(); while (rs.next()) { // 得到一個實例 object = clz.newInstance(); for (int i = 0; i < columStrings.length; i++) { // 得到每一列的名稱 String ColumnName = columStrings[i]; // 遍歷所有列的方法名稱進行比較 for (Method method : methods) { // 判斷方法上面是否有註解 if (method.isAnnotationPresent(ColumnAnnotation.class)) { // 得到一個註解的對象 ColumnAnnotation annotation = method .getAnnotation(ColumnAnnotation.class); // 根據我們數據庫的列名與我們註解的名稱來比較是否相等,相等的話,執行那個方法爲它設置值 if (ColumnName.equalsIgnoreCase(annotation.columnName())) { // 調用相應的方法 method.invoke(object, rs.getObject(ColumnName)); } } } } list.add(object); } }catch(Exception ex) { System.out.println("註解拋出異常!"); ex.printStackTrace(); } finally { this.getClose(); } return list; } /** * 得到數據庫所有的列名 * * @param rs * @return * @throws SQLException */ public String[] getColumnsName(ResultSet rs) throws SQLException { // 得到所有的列 ResultSetMetaData methodDate = rs.getMetaData(); // 得到列的總數 int methodCount = methodDate.getColumnCount(); String[] column = new String[methodCount]; for (int i = 1; i <= column.length; i++) { // 得到列的名稱 column[i - 1] = methodDate.getColumnName(i); } return column; } /*** * 查詢操作 * * @param sql * @return ResultSet */ public ResultSet executeQuerys(String sql) { try { //獲取連接 getConncetion(); pstmt = conncetion.prepareStatement(sql); rs = pstmt.executeQuery(); }catch (Exception e) { e.printStackTrace(); } return rs; } /*** * 非查詢操作 * * @param sql * @return */ public int executeUpdate(String sql) throws SQLException, Exception { int result=0; getConncetion(); pstmt = conncetion.prepareStatement(sql); result= pstmt.executeUpdate(); getClose(); return result; } } //end annotation操作 5.action中只要調用方法操作即可。
<% // 將過期日期設置爲一個過去時間 response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");