java反射擷取註解並拼接sql語句

來源:互聯網
上載者:User

標籤:

先建兩個註解 分別為 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語句

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.