java反射获取注解并拼接sql语句

先建两个注解 分别为 Table 和 Column

package com.hk.test;

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.hk.test;

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();
}

 

然后新建一个 bean 类 Filter.java (本类可根据自己需求更改,只要样式不变就好)

package com.hk.test;
@Table("user")
public class Filter {
    @Column("id")
    private int id;
    @Column("user_name")
    private String userName;
    @Column("age")
    private int age;
    @Column("email")
    private String email;
    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 int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

}

 

然后测试类

package com.hk.test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
*

  • @author hk_z

  • @deprecated 对类进行反射 获取注解和字段名 拼接成 sql 语句

  • @version 0.1
    */
    public class Test {
    public static void main(String[] args) {
    Filter f1
    = new Filter();
    f1.setId(
    10);

     Filter f2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Filter();
     f2.setUserName(</span>"lucy"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">模糊查询</span>
    
Filter f3 = new Filter(); f3.setEmail("zhangsan@qq.com,lisi@sina.com.cn"); //任意其一 String sql1 =query(f1); System.out.println(sql1); String sql2 =query(f2); System.out.println(sql2); String sql3 =query(f3); System.out.println(sql3); }
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> String query(Filter f1) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TODO Auto-generated method stub</span>
    StringBuilder sb =<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StringBuilder();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1.获取到class</span>
    Class c =<span style="color: rgba(0, 0, 0, 1)"> f1.getClass();
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2.获取到table 的名字</span>
    <span style="color: rgba(0, 0, 255, 1)">boolean</span> exists = c.isAnnotationPresent(Table.<span style="color: rgba(0, 0, 255, 1)">class</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">class 中有没有table的注解 </span>
    <span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 0, 0, 1)">exists){
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    Table t</span>= (Table)c.getAnnotation(Table.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
    String tableName </span>= t.value(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">表名</span>
    sb.append("select * from ").append(tableName).append(" where 1 = 1"<span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">3.遍历所有的字段</span>
    Field[] fArray =<span style="color: rgba(0, 0, 0, 1)"> c.getDeclaredFields();
    </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(Field field:fArray){
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">4.处理每个字段对应的sql
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">4.1 拿到字段名</span>
        <span style="color: rgba(0, 0, 255, 1)">boolean</span> fExists = field.isAnnotationPresent(Column.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
        </span><span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 0, 0, 1)">fExists){
            </span><span style="color: rgba(0, 0, 255, 1)">continue</span><span style="color: rgba(0, 0, 0, 1)">;
        }
        Column column </span>= field.getAnnotation(Column.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
        String columnName </span>= column.value();  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">表里面字段的名字
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">4.2拿到字段的值</span>
        String filedName = field.getName(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">变量的名字</span>
        String getMethodName = "get"+filedName.substring(0,1).toUpperCase()+filedName.substring(1<span style="color: rgba(0, 0, 0, 1)">);
        Object fieldValue </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拼装get方法 获取返回值 ;</span>
        <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            Method getMethod </span>= c.getMethod(getMethodName); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">反射</span>
            fieldValue = getMethod.invoke(f1);     <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">反射调用    </span>
} catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace();} //4.3 拼装 sql if(fieldValue == null||(fieldValue instanceof Integer &&(Integer)fieldValue==0)) { continue; } sb.append("and").append(filedName); String [] val=null; if(fieldValue instanceof String){ //字串型并且有逗号 进行拆分 if(((String)fieldValue).contains(",")){ val = ((String) fieldValue).split(","); sb.append("in("); for(String v:val){ sb.append("'").append(v).append("'").append(",");} sb.deleteCharAt(sb.length()-1); sb.append(")");} else{ sb.append("=").append("'").append(fieldValue).append("'");} } else if(fieldValue instanceof Integer){ sb.append("=").append(fieldValue); }
    }
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sb.toString();
}

}