• 利用注解进行sql反射代码示例


    1 @Target({ElementType.TYPE})
    2 @Retention(RetentionPolicy.RUNTIME)
    3 public @interface Table {
    4     String value();
    5 }
    表名注解
    1 @Target({ElementType.FIELD})
    2 @Retention(RetentionPolicy.RUNTIME)
    3 public @interface Column {
    4     String value();
    5 }
    字段注解
     1 @Table("user")
     2 public class Filter {
     3     @Column("id")
     4     private int id;
     5     @Column("username")
     6     private String userName;
     7     @Column("nickname")
     8     private String nickName;
     9     @Column("age")
    10     private int age;
    11     @Column("city")
    12     private String city;
    13     @Column("email")
    14     private String email;
    15     @Column("mobile")
    16     private String mobile;
    17     public int getId() {
    18         return id;
    19     }
    20     public void setId(int id) {
    21         this.id = id;
    22     }
    23     public String getUserName() {
    24         return userName;
    25     }
    26     public void setUserName(String userName) {
    27         this.userName = userName;
    28     }
    29     public String getNickName() {
    30         return nickName;
    31     }
    32     public void setNickName(String nickName) {
    33         this.nickName = nickName;
    34     }
    35     public int getAge() {
    36         return age;
    37     }
    38     public void setAge(int age) {
    39         this.age = age;
    40     }
    41     public String getCity() {
    42         return city;
    43     }
    44     public void setCity(String city) {
    45         this.city = city;
    46     }
    47     public String getEmail() {
    48         return email;
    49     }
    50     public void setEmail(String email) {
    51         this.email = email;
    52     }
    53     public String getMobile() {
    54         return mobile;
    55     }
    56     public void setMobile(String mobile) {
    57         this.mobile = mobile;
    58     }
    59 }
    一个表单类
     1 @Table("deapartment")
     2 public class Filter2 {
     3     @Column("id")
     4     private int id;
     5     @Column("name")
     6     private String name;
     7     @Column("amount")
     8     private String amount;
     9     @Column("age")
    10     private int age;
    11     @Column("city")
    12     private String city;
    13     public int getId() {
    14         return id;
    15     }
    16     public void setId(int id) {
    17         this.id = id;
    18     }
    19     public String getName() {
    20         return name;
    21     }
    22     public void setName(String name) {
    23         this.name = name;
    24     }
    25     public String getAmount() {
    26         return amount;
    27     }
    28     public void setAmount(String amount) {
    29         this.amount = amount;
    30     }
    31     public int getAge() {
    32         return age;
    33     }
    34     public void setAge(int age) {
    35         this.age = age;
    36     }
    37     public String getCity() {
    38         return city;
    39     }
    40     public void setCity(String city) {
    41         this.city = city;
    42     }
    43     
    44 }
    另一个表单类
     1 public class Test {
     2     public static void main(String[] args) {
     3         Filter f1 = new Filter();
     4         f1.setId(10);
     5         Filter f2 = new Filter();
     6         f2.setAge(45);
     7         f2.setCity("china");
     8         f2.setUserName("lucy");
     9         Filter f3 = new Filter();
    10         f3.setEmail("liu@sh.com,dahod@1223.com");
    11         String sql1 = query(f1);
    12         String sql2 = query(f2);
    13         String sql3 = query(f3);
    14         System.out.println(sql1);
    15         System.out.println(sql2);
    16         System.out.println(sql3);
    17         
    18         Filter2 filter2 = new Filter2();
    19         filter2.setId(02);
    20         filter2.setAge(15);
    21         filter2.setAmount("14");
    22         filter2.setName("小明");    
    23         System.out.println(query(filter2));
    24     }
    25     @SuppressWarnings("unused")
    26     private static String query(Object f){
    27         StringBuffer sb = new StringBuffer();
    28         //1.获取到class
    29         Class c = f.getClass();
    30         //2.获取到table的名字
    31         boolean exsits = c.isAnnotationPresent(Table.class);
    32         if(!exsits){
    33             return null;
    34         }
    35         Table t = (Table) c.getAnnotation(Table.class);
    36         String tableName = t.value();
    37         sb.append("select *from ").append(tableName).append(" where 1=1");
    38         //3.变量所有的字段
    39         Field[] farray = c.getDeclaredFields();
    40         for(Field field :farray){
    41             //4.0处理每个字段对应的名字
    42             //4.1拿到字段名
    43             boolean fExist = field.isAnnotationPresent(Column.class);
    44             if(!fExist){
    45                 continue;
    46             }
    47             Column column = field.getAnnotation(Column.class);
    48             String coiumnName = column.value();
    49             //4.2拿到字段的值
    50             String filedName = field.getName();
    51             String getMethodName = "get"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
    52             Object fieldValue = null;
    53             try {
    54                 Method getMethod = c.getMethod(getMethodName);
    55                 fieldValue =getMethod.invoke(f);
    56             } catch (Exception e) {
    57                 // TODO Auto-generated catch block
    58                 e.printStackTrace();
    59             }
    60             //4.3拼装sql
    61             if(fieldValue ==null||
    62                     (fieldValue instanceof Integer &&(Integer)fieldValue==0)){
    63                 continue;
    64             }
    65             sb.append(" and ").append(filedName);
    66             if(fieldValue instanceof String){
    67                 if(((String)fieldValue).contains(",")){
    68                     String [] values = ((String)fieldValue).split(",");
    69                     sb.append(" in(");
    70                     for(String v:values){
    71                         sb.append("'").append(v).append("'").append(",");
    72                     }
    73                     sb.deleteCharAt(sb.length()-1);
    74                     sb.append(")");
    75                 }else{
    76                 sb.append("=").append("'").append(fieldValue).append("'");
    77                 }
    78             }else if(fieldValue instanceof Integer){
    79                 sb.append("=").append(fieldValue);
    80             }
    81             //sb.append(" and ").append(filedName).append("=").append(fieldValue);
    82         }
    83         return sb.toString();
    84         
    85         
    86     }
    87 }
    测试类
    1 select *from user where 1=1 and id=10
    2 select *from user where 1=1 and userName='lucy' and age=45 and city='china'
    3 select *from user where 1=1 and email in('liu@sh.com','dahod@1223.com')
    4 select *from deapartment where 1=1 and id=2 and name='小明' and amount='14' and age=15
    输出结果
  • 相关阅读:
    【Nginx】url 带有 “https://” 双斜杠特殊处理
    【layui】tepmlet 格式化 table 数据
    于二零二零年:终章
    【Golang】练习-Web 处理 form 表单请求失败不刷新页面并保存输入的数据
    实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)
    面向对象的进阶(item系列,__new__,__hash__,__eq__)
    面向对象阶段复习
    计算器实例
    反射
    静态方法staticmethod和类方法classmethod
  • 原文地址:https://www.cnblogs.com/wwzyy/p/4974815.html
Copyright © 2020-2023  润新知