整理一下自己的笔记,关于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中只要调用方法操作即可。