標籤:java orm web架構 bean api
java註解在web架構中使用比較廣泛,這使得對象之間的關係配置起來更加容易
目前web架構中最常用的兩種設定物件依賴關係的方式就是註解和xml設定檔的方法,api配置相對來說用的少一些,
下面實現一個Table註解來實現資料庫表和實體bean之間的對應關係,實現一個Column註解來實現資料庫表中每個欄位和實體bean每個屬性之間的
對應關係。java中的orm基本上就是根據這種思想來實現的。
Table註解代碼:
package com.panther.dong.annotation.anno;import java.lang.annotation.*;/** * Created by panther on 15-8-3. */@Target( { ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Table { String value() default "";}
Column註解代碼:
package com.panther.dong.annotation.anno;import java.lang.annotation.*;/** * Created by panther on 15-8-3. */@Target( { ElementType.FIELD })@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Column { String value() default "";}建立一個student實體bean,給這個bean打上Table註解和Column註解
package com.panther.dong.annotation.pojo;import com.panther.dong.annotation.anno.Column;import com.panther.dong.annotation.anno.Table;/** * Created by panther on 15-8-3. */@Table("student")public class Student { @Column("id") private int id; @Column("name") private String name; @Column("age") private int age; @Column("sex") private String sex; public Student() { } public Student(int id, String name, int age, String sex) { this.id = id; this.name = name; this.age = age; this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}
通過反射擷取Table註解Student對應的資料庫中表的名稱,通過Column註解獲得bean中屬性對應資料庫中 的欄位,通過反射獲得運行時實體bean中屬性
的取值,拼湊出sql。代碼如下:
package com.panther.dong.annotation.parse;import com.panther.dong.annotation.anno.Column;import com.panther.dong.annotation.anno.Table;import com.panther.dong.annotation.pojo.Student;import java.lang.reflect.Field;/** * Created by panther on 15-8-3. */public class ParsePojo { private final static String QUERY_SQL = "select * from "; /** * 解析註解 * * @param object 被註解的對象 * @return */ public String getSelect(Object object) { String sql = QUERY_SQL; //獲得需要查詢的表名稱 Class cls = object.getClass(); boolean isTable = cls.isAnnotationPresent(Table.class); if (isTable) { Table tableName = (Table) cls.getAnnotation(Table.class); sql += tableName.value(); } //拼湊sql if (object != null) { sql += " where "; } //擷取屬性對應註解的名稱和屬性運行時的值 Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object val = null; try { val = (Object) field.get(object); } catch (Exception e) { System.out.println("get fileld value failure"); } boolean isColumn = field.isAnnotationPresent(Column.class); if (isColumn) { Column columnName = (Column) field.getAnnotation(Column.class); if (val != null && val instanceof String) { sql += columnName.value() + "=\'" + val + "\'&&"; } else if (val != null && val instanceof Integer) { sql += columnName.value() + "=" + val + "&&"; } } } sql = sql.substring(0, sql.length() - 2); return sql; } public static void main(String[] args) { Student student = new Student(); student.setAge(19); student.setName("panther"); String sql = new ParsePojo().getSelect(student); System.out.println(sql); }}
運行程式,得到結果:
運行結果得到sql語句,之後再根據sql語句查詢資料庫得到結果!!!(後續查詢資料庫應該很簡單了)
代碼的目錄結構為:
java反射和註解在實現架構的類別關係之間的配置和資源之間的配置非常有用
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
java註解例子