標籤:
先建兩個註解 分別為 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 = new Filter(); f2.setUserName("lucy"); //模糊查詢 Filter f3 = new Filter(); f3.setEmail("[email protected],[email protected]"); //任意其一 String sql1 =query(f1); System.out.println(sql1); String sql2 =query(f2); System.out.println(sql2); String sql3 =query(f3); System.out.println(sql3); } private static String query(Filter f1) { // TODO Auto-generated method stub StringBuilder sb =new StringBuilder(); //1.擷取到class Class c = f1.getClass(); //2.擷取到table 的名字 boolean exists = c.isAnnotationPresent(Table.class); //class 中有沒有table的註解 if(!exists){ return null; } Table t= (Table)c.getAnnotation(Table.class); String tableName = t.value(); //表名 sb.append("select * from ").append(tableName).append(" where 1 = 1"); //3.遍曆所有的欄位 Field[] fArray = c.getDeclaredFields(); for(Field field:fArray){ //4.處理每個欄位對應的sql //4.1 拿到欄位名 boolean fExists = field.isAnnotationPresent(Column.class); if(!fExists){ continue; } Column column = field.getAnnotation(Column.class); String columnName = column.value(); //表裡面欄位的名字 //4.2拿到欄位的值 String filedName = field.getName(); //變數的名字 String getMethodName = "get"+filedName.substring(0,1).toUpperCase()+filedName.substring(1); Object fieldValue = null; //拼裝get方法 擷取傳回值 ; try { Method getMethod = c.getMethod(getMethodName); //反射 fieldValue = getMethod.invoke(f1); //反射調用 } 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); } } return sb.toString(); }}
java反射擷取註解並拼接sql語句