java注解实践 需求: 1.给定一张user表,字段包括userId,... 2.方便的对没个字段或字段的组合条件进行检索,并打印sql
package javaAnnotation;
/**
* Created with IntelliJ IDEA.
* User: bobo
* Date: 2019/9/12
* Description: No Description
*/
@Table("user")
public class Filter {
@Colume("id")
private int id;
@Colume("user_name")
private String userName;
@Colume("nick_name")
private String nickName;
@Colume("age")
private int age;
@Colume("city")
private String city;
@Colume("email")
private String email;
@Colume("phone_num")
private int phoneNum;
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 int getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(int phoneNum) {
this.phoneNum = phoneNum;
}
}
package javaAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created with IntelliJ IDEA.
* User: bobo
* Date: 2019/9/12
* Description: No Description
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
package javaAnnotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created with IntelliJ IDEA.
* User: bobo
* Date: 2019/9/12
* Description: No Description
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Colume {
String value();
}
package javaAnnotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created with IntelliJ IDEA.
* User: bobo
* Date: 2019/9/12
* Description: No Description
*/
public class FilterTest {
public static String query(Filter filter){
StringBuilder sb = new StringBuilder();
Class<? extends Filter> clazz = filter.getClass();
boolean annotationPresent = clazz.isAnnotationPresent(Table.class);
if (!annotationPresent) {
return null;
}
Table table = clazz.getAnnotation(Table.class);
sb.append("select * from ").append(table.value());
sb.append(" where 1=1");
//遍历所有field
Field[] fields = clazz.getDeclaredFields();
for (Field field:fields){
boolean isExist = field.isAnnotationPresent(Colume.class);
if (!isExist) {
continue;
}
Colume columeAnnotation = field.getAnnotation(Colume.class);
//boolean类型需要特殊处理
String methodName = "get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
Method method = getMethod(clazz, methodName);
Object invoke = null;
if (method!=null) {
try {
invoke = method.invoke(filter);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if (invoke==null || invoke.equals("") ||(invoke instanceof Integer && (int)invoke ==0)) {
continue;
}
sb.append(" and "+columeAnnotation.value());
sb.append(" = ");
sb.append("" + invoke);
}
}
return sb.toString();
}
public static Method getMethod(Class clazz,String method){
Method[] methods = clazz.getMethods();
for (Method m : methods){
if (m.getName().equals(method)){
return m;
}
}
return null;
}
public static void main(String[] args) {
Filter filter = new Filter();
filter.setId(1);
filter.setAge(111);
filter.setCity("beijing");
filter.setUserName("bobo");
String query = query(filter);
System.out.println("query = " + query);
}
}
测试结果: