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