zoukankan      html  css  js  c++  java
  • annotation使用示例

    annotation使用示例

    学习了:https://www.imooc.com/learn/456

    Annotation编写规则:@Target,@Retention,设置一些String、int属性;@Inherited只能继承类的;只有一个属性只能叫value;

    使用的时候使用反射机制,annotation中的方法就是在反射的时候取值的方法;

    代码:

    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); // 表示查询id为10的用户
            
            Filter f2 = new Filter();
            f2.setUserName("lucy"); // 表示查询用户名为lucy的用户
            f2.setAge(18);
            
            Filter f3 = new Filter();
            f3.setEmail("liu@sina.com.cn"); // 查询邮箱为其中任意一个的用户 ,zh@163.com,77777@qq.com
            
            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("技术部");
            System.out.println(query(filter2));
            
        }
    
        private static String query(Object f) {
            StringBuilder builder = new StringBuilder();
            // 1, 获取到class
            Class c = f.getClass();
            // 2, 获取到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, 遍历所有的字段
            Field[] fArray = c.getDeclaredFields();
            for (Field field : fArray) {
                // 4. 处理每个字段对应的sql
                // 4.1 拿到字段名
                boolean fExists = field.isAnnotationPresent(Column.class);
                if(!fExists) {
                    continue;
                }
                Column column = field.getAnnotation(Column.class);
                String columnName = column.value();
                // 4.2 拿到字段的值
                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();
        }
    }
  • 相关阅读:
    Hbase源码分析:Hbase UI中Requests Per Second的具体含义
    Hbase源码分析:server端RPC
    Hbase源码分析:RPC概况
    python使用mysql connection获取数据感知不到数据变化问题
    虚拟机加载机制读后感
    Spark学习笔记1:Application,Driver,Job,Task,Stage理解
    架构模式: 日志聚合
    架构模式: 服务集成协议测试
    架构模式: 服务组件测试
    架构模式: 访问令牌
  • 原文地址:https://www.cnblogs.com/stono/p/8972896.html
Copyright © 2011-2022 走看看