剛學完註解之後可能大家還有一些問題,這裏我們通過一個簡單的sql語句拼接的方式,來進行一下註解的總結和學習:
首先,我們建立一個表,並且聲明表中的字段:
package com.item;
@Table("user")
public class Filter {
@Column("id")
private int id;
@Column("userName")
private String userName;
@Column("nickName")
private String nickName;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email;
@Column("mobile")
private String mobile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
在這裏我們用到了兩個註解,一個用來表示表,一個用來表示各字段,接下來進行自定義這兩個註解:
package com.item;
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();
}
package com.item;
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();
}
最後,我們正式開始sql語句拼接的工作:
package com.item;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
Filter f1=new Filter();
f1.setId(10);//表示查詢id爲10的用戶
Filter f2=new Filter();
f2.setUserName("username");//模糊查詢用戶名爲username
Filter f3=new Filter();
f3.setEmail("[email protected]");//查詢郵箱
Test test=new Test();
test.query(f1);
String sql1=query(f1);
String sql2=query(f2);
String sql3=query(f3);
System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3);
}
private static String query(Filter f){
StringBuilder s=new StringBuilder();
Class c=f.getClass();//反射機制
boolean table=c.isAnnotationPresent(Table.class);//判斷是否存在該註解
if(!table) {
return null;
}
Table annotationTable=(Table)c.getAnnotation(Table.class);//獲取該註解
String tablename=annotationTable.value();
s.append("select* from").append(tablename).append("where 1=1");
//遍歷所有的字段
Field[] field=c.getDeclaredFields();//獲取到所有字段
for (Field field2 : field) {
String fieldName=field2.getName();
boolean a=c.isAnnotationPresent(Column.class);//判斷是否存在該註解
if(a) {
continue;
}
// Column column=(Column)c.getAnnotation(Column.class);
// String columname=column.value();
String MethodName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);//將屬性名字的首字母大寫,加上後面的部分,在前面加上get則得到getter方法的方法名
Object fieldValue=null;
try {
Method m = c.getMethod(MethodName);
fieldValue=m.invoke(f);//利用java反射機制調用函數
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(fieldValue==null||(fieldValue instanceof Integer && (Integer)fieldValue==0)) {
continue;
}
s.append("and").append(fieldName).append("=").append(fieldValue);
}
return s.toString();
}
}
最終的運行結果爲:
select* fromuserwhere 1=1andid=10
select* fromuserwhere 1=1anduserName=username
select* fromuserwhere [email protected]