解析注解:
通过反射获取类、函数或者成员运行时的注解信息,从而实现动态控制程序运行的逻辑。
根据imooc网的学习自行整理
1、首先建立JavaBean,如Student.java,Course.java
package com.imooc.sqlann; @Table("student") public class Student { @Column("stuid") private int id; @Column("stuname") private String name; @Column("stuage") private int age; @Column("stuemail") private String email; 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 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.imooc.sqlann; @Table("course") public class Course { @Column("couid") private int id; @Column("couname") private String name; 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; } }
2、因JavaBean中使用了自定义注解,因而需要自行定义Annotation,如Table.java,Column.java
package com.imooc.sqlann; 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.imooc.sqlann; 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(); }
3、创建ParseSQLAnn进行注解解析
3.1 传入参数Object obj
3.2 获取入参的类类型Class
3.3 找到类上的Table注解
3.4 获取字段名与Column列名
3.5 通过invoke反射求出字段值
3.6 拼凑SQL语句
package com.imooc.sqlann; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ParseSQLAnn { public static String query(Object obj){ StringBuffer sb = new StringBuffer(); sb.append("select * from "); //1、获得obj对应的class Class c = obj.getClass(); //2、找到类上的注解 boolean isExit; isExit = c.isAnnotationPresent(Table.class); if(!isExit){ return null; } Table tab = (Table) c.getAnnotation(Table.class); String tableName = tab.value(); sb.append(tableName).append(" where 1=1"); //3、获取字段名 Field[] fs = c.getDeclaredFields(); for(Field f : fs){ isExit = f.isAnnotationPresent(Column.class); if(!isExit){ continue; } Column col = (Column)f.getAnnotation(Column.class); String columnName = col.value(); String fieldName = f.getName(); //4、获取字段值,反射机制 String getName = "get"; getName = getName + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); Object fieldValue = null; try { Method m = c.getMethod(getName); fieldValue = m.invoke(obj); } catch (Exception e) { e.printStackTrace(); } if (fieldValue == null || (fieldValue instanceof Integer && (Integer) fieldValue == 0)) { continue; }else{ sb.append(" and ").append(columnName); if (fieldValue instanceof String) { if(((String) fieldValue).contains(",")){ String[] ss = ((String) fieldValue).split(","); sb.append(" in("); for(String s : ss){ sb.append("'").append(s).append("'").append(","); } sb.deleteCharAt(sb.length()-1); sb.append(")"); }else{ sb.append(" = '").append(fieldValue).append("'"); } } else if (fieldValue instanceof Integer) { sb.append(" = ").append((Integer) fieldValue); } } } return sb.toString(); } }
4、编写测试类进行测试
package com.imooc.sqlann; public class SQLTest { public static void main(String[] args) { Student s1 = new Student(); s1.setAge(10); s1.setName("huxiao"); Student s2 = new Student(); s2.setName("huda"); Student s3 = new Student(); s3.setEmail("[email protected],[email protected]"); String sql1 = ParseSQLAnn.query(s1); String sql2 = ParseSQLAnn.query(s2); String sql3 = ParseSQLAnn.query(s3); System.out.println(sql1); System.out.println(sql2); System.out.println(sql3); Course c1 = new Course(); c1.setName("Java开发"); String sql4 = ParseSQLAnn.query(c1); System.out.println(sql4); } }