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;
/**
*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); }
@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>
} 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)">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>
} </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sb.toString(); }
}