Java註解的簡單應用
阿新 • • 發佈:2020-06-29
一.註解的定義
package com.microli.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String value(); }
@interface 註解名{}
定義時需要新增內建的註解宣告
@Target:註解能使用在什麼地方,值是ElementType陣列
package java.lang.annotation; public enum ElementType { TYPE, /* 類、介面(包括註釋型別)或列舉宣告 */ FIELD, /* 欄位宣告(包括列舉常量) */ METHOD, /* 方法宣告 */ PARAMETER, /* 引數宣告 */ CONSTRUCTOR,/* 構造方法宣告 */ LOCAL_VARIABLE, /* 區域性變數宣告 */ ANNOTATION_TYPE, /* 註釋型別宣告 */ PACKAGE /* 包宣告 */ }
@Retention:註解資訊儲存的位置,通常使用RetentionPolicy.RUNTIME,可以在執行時獲取其資訊
package java.lang.annotation; public enum RetentionPolicy { SOURCE, /* Annotation資訊僅存在於編譯器處理期間,編譯器處理完之後就沒有該Annotation資訊了*/ CLASS, /* 編譯器將Annotation儲存於類對應的.class檔案中。預設行為 */ RUNTIME /* 編譯器將Annotation儲存於class檔案中,並且可由JVM讀入 */ }
二.註解簡單應用之拼接查詢語句
在框架中一般是使用註解配合反射拼接查詢語句,例如:
1.定義兩個註解,一個代表insert語句中的表名Table,一個代表列名Column(此時值都是String型別)
package com.microli.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //代表類註解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Table { String value(); }
package com.microli.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //代表屬性註解 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String value(); }
2.在JavaPOJO中,添加註解
package com.microli.annotation; //類註解 @Table("user") public class User { //屬性註解 @Column("account") private String account; @Column("password") private String password; public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
3.編寫DAO操作類,新增各種方法傳入JavaPOJO得到對應的Sql語句,此處示例為add方法拼接insert語句做資料庫的增加操作
package com.microli.annotation; import java.lang.reflect.Field; public class DAO { /** * 拼接插入Sql語句 * * @param t 形參(例:user) * @param <T> 形參型別(例:User) */ public <T> void add(T t) throws Exception { //定義初始sql語句為空字串以便後面拼接 String sql = ""; //得到引數 t 的Class類物件 c Class c = t.getClass(); //得到類註解,即查詢的表名 Table table = (Table) c.getAnnotation(Table.class); //如果存在表名註解則取其值value拼接上sql字串注意括號"("的存在 if (table != null) { sql += "insert into " + table.value() + "(";//sql="insert into table( } //獲取引數實體類中的所有屬性 Field[] fields = c.getDeclaredFields(); //迴圈判斷屬性前是否有列名註解,有則取其值value拼接sql字串注意逗號","的存在 for (Field field : fields) { Column column = field.getAnnotation(Column.class); if (column != null) { sql += column.value() + ",";//sql="insert into table(column1,column2, } } //列名拼接完最後的逗號去除 sql = sql.substring(0, sql.length() - 1);//sql="insert into table(column1,column2 //增加拼接sql賦值的字串 sql += ") values(";//sql="insert into table(column1,column2) values( //迴圈取出存在註解的屬性值 for (Field field : fields) { Column column = field.getAnnotation(Column.class); if (column != null) { //由於屬性是私有,設定可訪問 field.setAccessible(true); //拼接屬性值注意要有對應的單引號 sql += "'" + field.get(t) + "',";//sql="insert into table(column1,column2) values('value1','value2', } } //值拼接完後最後逗號去除 sql = sql.substring(0, sql.length() - 1);//sql="insert into table(column1,column2) values('value1','value2' //拼接最後的括號")" sql += ")";//sql="insert into table(column1,column2) values('value1','value2') //得到完整的sql語句 System.out.println(sql); } }
4.測試
package com.microli.annotation; public class Test { public static void main(String[] args) throws Exception { DAO dao = new DAO(); User user = new User(); user.setAccount("123"); user.setPassword("qwe"); dao.add(user); } }