java注解实例-反射生成sql
定义描述用户表的注解:
package dao; 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(); }
定义描述用户属性的注解:
1 package dao; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 13 // 作用域 14 @Target({ ElementType.FIELD }) 15 @Retention(RetentionPolicy.RUNTIME) 16 public @interface Column { 17 String value(); 18 }
定义映射Bean类User:
1 package dao; 2 3 /** 4 * 5 * 用户表,字段包括:用户ID、用户名、昵称、年龄、性别、所在城市、邮箱、手机号: 6 * 7 * @author 8 */ 9 @Table("user") 10 public class User { 11 @Column("id") 12 private int id; 13 14 @Column("user_name") 15 private String userName; 16 17 @Column("nick_name") 18 private String nickName; 19 20 @Column("age") 21 private int age; 22 23 @Column("city") 24 private String city; 25 26 @Column("email") 27 private String email; 28 29 @Column("mobile") 30 private String mobile; 31 32 public int getId() { 33 return id; 34 } 35 36 public void setId(int id) { 37 this.id = id; 38 } 39 40 public String getUserName() { 41 return userName; 42 } 43 44 public void setUserName(String userName) { 45 this.userName = userName; 46 } 47 48 public String getNickName() { 49 return nickName; 50 } 51 52 public void setNickName(String nickName) { 53 this.nickName = nickName; 54 } 55 56 public int getAge() { 57 return age; 58 } 59 60 public void setAge(int age) { 61 this.age = age; 62 } 63 64 public String getCity() { 65 return city; 66 } 67 68 public void setCity(String city) { 69 this.city = city; 70 } 71 72 public String getEmail() { 73 return email; 74 } 75 76 public void setEmail(String email) { 77 this.email = email; 78 } 79 80 public String getMobile() { 81 return mobile; 82 } 83 84 public void setMobile(String mobile) { 85 this.mobile = mobile; 86 } 87 }
根据参数动态返回查询语句:
1 package dao; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Method; 5 6 /** 7 * 根据参数动态返回查询语句 8 * 9 * @author10 */ 11 public class ReturnQuery { 12 13 public static String query(User u1) { 14 StringBuilder str = new StringBuilder(); 15 // 1.获取一个类class 16 Class c = u1.getClass(); 17 // 2.获取Table的名字 18 boolean exists = c.isAnnotationPresent(Table.class); 19 if (!exists) { 20 return null; 21 } 22 Table t = (Table) c.getAnnotation(Table.class); 23 String tableName = t.value(); 24 str.append("select * from ").append(tableName).append("where 1=1"); 25 // 3.遍历所有的 字段 26 Field fArray[] = c.getDeclaredFields(); 27 for (Field field : fArray) { 28 // 4.处理每个字段对应的sql 29 // 4.1取到字段名 30 boolean fExists = field.isAnnotationPresent(Column.class);// 判断是否包含Column类型的注解 31 if (!fExists) { 32 continue; 33 } 34 Column column = field.getAnnotation(Column.class); 35 String columnName = column.value(); 36 // 4.2取到字段的值 37 String fieldName = field.getName(); 38 // 获取相应字段的getXXX()方法 39 String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); 40 Object fieldValue=null; 41 try { 42 Method getMethod = c.getMethod(getMethodName); 43 fieldValue = getMethod.invoke(u1); 44 } catch (Exception e) { 45 e.printStackTrace(); 46 } 47 //4.3拼接Sql 48 if (fieldValue==null||fieldValue instanceof Integer &&(Integer)fieldValue==0) { 49 continue; 50 } 51 str.append(" and ").append(fieldName); 52 if (fieldValue instanceof String) { 53 if (((String) fieldValue).contains(",")) { 54 String[] values=((String) fieldValue).split(","); 55 str.append(" in ("); 56 for (String s : values) { 57 str.append("'").append(s).append("'").append(","); 58 } 59 str.deleteCharAt(str.length()-1); 60 str.append(")"); 61 }else{ 62 str.append("=").append("'").append(fieldValue).append("' "); 63 } 64 }else { 65 str.append("=").append(fieldValue); 66 } 67 } 68 return str.toString(); 69 } 70 71 }
测试类:
1 package dao; 2 3 public class Test { 4 public static void main(String[] args) { 5 User u1 = new User(); 6 u1.setId(10); // 查询id 7 8 User u2 = new User(); 9 u2.setUserName("JSFei"); // 模糊查询用户名 10 u2.setAge(21); 11 12 User u3 = new User(); 13 u3.setEmail("123@163.com,123@qq.com"); // 查询邮箱有任意一个的用户 14 15 String sql1 = ReturnQuery.query(u1); 16 String sql2 = ReturnQuery.query(u2); 17 String sql3 = ReturnQuery.query(u3); 18 19 System.out.println(sql1); 20 System.out.println(sql2); 21 System.out.println(sql3); 22 } 23 }
输出结果:
...............................................