如何通過注解Bean類來封裝SQL插入語句
整體思路是醬紫的:
給bean上注解說明該bean對應(yīng)著數(shù)據(jù)庫中哪張表,給每個bean的屬性都注解說明各自對應(yīng)著這張表的哪個字段。
通過類反射獲取表名,通過逐個反射每個屬性的getter方法,獲取注解在屬性上的字段名,以及屬性值。
拿到表名、字段名、值,就可以拼接插入語句了。
細細道來:
定義bean :
你需要定義一個有getter、setter及注解的bean,like this:
@Table(name = "PUPIL_STUDENT")
public class StudentBean {
@Column(name = "ROW_ID")
private String id;
@Column(name = "NAME")
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
定義注解類:
使用注解的前提是你必須先定義注解類:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table
{
/**
* 數(shù)據(jù)庫表名
*/
public abstract String name();
}
這是注解類的一般定義方法,三點說明:
1.使用@interface定義注解類;
2.@Retention(RetentionPolicy.RUNTIME) 表示該注解可以在運行期被讀取;
3.@Target(ElementType.TYPE)表示這個注解只能被用到目標類(如StudentBean)的方法上。
Column注解類也是類似的定義方式。
反射獲取Class與Method :
想要通過反射獲取表名、字段名等,需要先獲取類對象和方法對象(反射的慣用套路):
Class<?> clz = obj.getClass(); //obj就是bean對象的名稱
Method[] methods = clz.getMethods();
獲取表名:
獲取表名的關(guān)鍵代碼是:
Table _table = clazz.getAnnotation( Table.class );//獲取注解類
String table_name = _table.name();//獲取注解類的屬性
通過bean上面的代碼:@Table(name = "PUPIL_STUDENT") 就可以看出,獲取的table_name就等于:”PUPIL_STUDENT”。
需要注意的地方是:
如果在當前類中并未找到Table注解,即:上面的_table變量為null,這時,你需要“上訴”到父類繼續(xù)去尋找,也就是說,此時需要把clazz改為父類的Class實例:
clazz = clazz.getSuperclass();
然后再獲取注解。這個邏輯應(yīng)該要用到一個do{}while()循環(huán)吧。
獲取每一個字段名:
通過Method[] methods = clz.getMethods()已經(jīng)獲取到所有方法了,遍歷每個方法,我們現(xiàn)在的目標是,拿到屬性值和屬性上方的注解字段名。
對每一個method,調(diào)用getName()就能得到method的名稱,然后拿到以”get”開頭的方法。以getId()為例,這個方法的方法名為:”getId”,截取”get”之后的字符串,即:Id,然后將其首字母變?yōu)樾懀矗?/span>id,就得到了一個屬性名。其他屬性名也是這樣獲取。
由于getter方法就是獲取屬性值的方法,那么通過反射技術(shù):method.invoke(obj, new Object[]{});就獲取到了該屬性的值。
在反射技術(shù)中,變量對應(yīng)的類是Field,既然拿到了變量名,那么通過變量名來獲取對應(yīng)的Field,再通過Field來獲取變量(屬性)上方的Column注解,再通過注解獲取字段名稱,一氣呵成:
Field f= clz.getDeclaredField(m_name);
Column col = f.getAnnotation(Column.class);
String col_name = col.name();
表名有了,每一個字段名,字段值也有了,接下來就可以拼接成SQL了。
更多內(nèi)容關(guān)注微信號:it_pupil

posted on 2017-02-22 16:37 搬磚的小學(xué)生 閱讀(1515) 評論(0) 收藏 舉報
浙公網(wǎng)安備 33010602011771號