Annotation usage example

Annotation usage example

Learned: https://www.imooc.com/learn/456

Annotation writing rules: @Target, @Retention, set some String and int properties; @Inherited can only inherit classes; only one property can only be called value;

When using it, the reflection mechanism is used, and the method in the annotation is the method of taking the value during reflection;

Code:

Annotation Column:

package com.imooc.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Column {
    String value();
}

Annotation Table:

package com.imooc.test;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Table {
    String value();
}

Filter:

package com.imooc.test;

@Table("user")
public class Filter {

    @Column("id")
    private int id;
    @Column("user_name")
    private String userName;
    @Column("nick_name")
    private String nickName;
    @Column("age")
    private int age;
    @Column("city")
    private String city;
    @Column("email")
    private String email;
    @Column("mobile")
    private String mobile;

    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 String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

}

Filter2:

package com.imooc.test;

@Table("department")
public class Filter2 {

    @Column("id")
    private int id;
    @Column("name")
    private String name;
    @Column("leader")
    private String leader;
    @Column("amount")
    private int amount;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLeader() {
        return leader;
    }
    public void setLeader(String leader) {
        this.leader = leader;
    }
    public int getAmount() {
        return amount;
    }
    public void setAmount(int amount) {
        this.amount = amount;
    }
    

}

Test:

package com.imooc.test;

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

public class Test {

    public static void main(String[] args) {
        Filter f1 = new Filter();
        f1.setId( 10); // Indicates that the user whose id is 10 
        
        Filter f2 = new Filter();
        f2.setUserName( "lucy"); // means to query the user whose username is lucy 
        f2.setAge(18 );
        
        Filter f3 = new Filter();
        f3.setEmail( "[email protected]"); // Query the user whose mailbox is any of them,[email protected],[email protected] 
        
        String sql1 = query(f1);
        String sql2 = query(f2);
        String sql3 = query(f3);
        
        System.out.println(sql1);
        System.out.println(sql2);
        System.out.println(sql3);
        
        
        Filter2 filter2 = new Filter2();
        filter2.setAmount(10);
        filter2.setName( "Technical Department" );
        System.out.println(query(filter2));
        
    }

    private static String query(Object f) {
        StringBuilder builder = new StringBuilder();
         // 1, get the class 
        Class c = f.getClass();
         // 2, get the name of the table 
        boolean exists = c.isAnnotationPresent(Table.class ) ;
         if (! exists) {
             return  null ;
        }
        Table t = (Table) c.getAnnotation(Table.class);
        String tableName = t.value();
        builder.append( "select * from ").append(tableName).append(" where 1=1" );
         // 3, traverse all fields 
        Field[] fArray = c.getDeclaredFields();
         for (Field field : fArray) {
             // 4. Process the sql corresponding to each field
             // 4.1 Get the field name 
            boolean fExists = field.isAnnotationPresent(Column.class ) ;
             if (! fExists) {
                 continue ;
            }
            Column column = field.getAnnotation(Column.class);
            String columnName = column.value();
             // 4.2 Get the value of the field 
            String fieldName = field.getName();
            String getMethodName = "get"+ fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
            Method getMethod;
            Object fieldValue=null;
            try {
                getMethod = c.getMethod(getMethodName);
                fieldValue = getMethod.invoke(f);
            } catch (Exception e) {
                e.printStackTrace ();
            }  
            // 4.3 拼装sql
            if(fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)) {
                continue;
            }
            builder.append(" add ").append(fieldName);
            if(fieldValue instanceof String) {
                if(((String)fieldValue).contains(",")) {
                    String[] values = ((String)fieldValue).split(",");
                    builder.append("in(");
                    for (String v : values) {
                        builder.append("'").append(v).append("',");
                    }
                    builder.deleteCharAt(builder.length()-1);
                    builder.append(")");
                }else {
                    builder.append("=").append("'").append(fieldValue).append("'");
                }
            } else if (fieldValue instanceof Integer) {
                builder.append("=").append(fieldValue);
            }
        }
        return builder.toString();
    }
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325148991&siteId=291194637