自定义Annotation的实用场景和实操代码(hbase交互)

场景

注解的实用,当然是为了让我们的代码更具有扩展性, 更加的高大上, 例如将 数据库表与对象添加注解,进行对应.

例如:
我们可以直接将一条半结构化数据经过处理放到hbase数据库中,但是这样的话,如果列非常多的情况,我们的代码也要很长,但是实用注解配合反射的用法,可以提高扩展性,在数据量大,列多的情况,可以简化我们的代码

代码:
自定义注解:

/**
* 规则: 列名为""时, 属性名就是列名
*/
@Target({
    
    ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    
    

    String family()  default "info";
    String column()  default "";
}

 /**
     *   以字符串的形式像hbase中插入数据
     * @param data
     * @throws Exception
     */
     public void insertDatas(String data) throws  Exception{
    
    

        //1. 获取到要添加的数据
        String[] split = data.split("\t");
        String  call1=split[0];
        String  call2=split[1];
        String  callTime=split[2];
        String  duration=split[3];

        //2.  TODO 设计rowkey 重要

     
        // rowkey = partitionNum+ call1 +call2+time+duration

        String rowkey=getPartitionNum(call1,callTime)+"_"+call1+"_"+call2+"_"+callTime+"_"+duration;
        Put put = new Put( rowkey.getBytes());

        put.addColumn(Names.CF_CALLER.value().getBytes(), Bytes.toBytes("call1"),Bytes.toBytes(call1));
        put.addColumn(Names.CF_CALLER.value().getBytes(), Bytes.toBytes("call2"),Bytes.toBytes(call2));
        put.addColumn(Names.CF_CALLER.value().getBytes(), Bytes.toBytes("callTime"),Bytes.toBytes(callTime));
        put.addColumn(Names.CF_CALLER.value().getBytes(), Bytes.toBytes("duration"),Bytes.toBytes(duration));

        //插入数据
        putData(put);

    }

注解+反射的方式: 这样的话,只需要添加相应的注解,再用反射进行获取值就ok了!
(虽然看起来可能比较麻烦)

 protected   void putData(Object obj) throws  Exception{
    
    

        // TODO 1.根据注解获取到对应表的名称

        Class clazz = obj.getClass();
        com.dxy.common.api.TableName  annotation = (com.dxy.common.api.TableName)clazz.getAnnotation(com.dxy.common.api.TableName.class);

        String tableName = annotation.value();

        Connection connection = getConnection();
        Table connectionTable = connection.getTable(TableName.valueOf(tableName));

        // TODO 2. 获取rowkey值
        String rowkey="";
        Field[] fields = clazz.getDeclaredFields();//获取对象全部的属性

        for (Field field : fields) {
    
    

            Rowkey rowkeyAnno =  field.getAnnotation(Rowkey.class);
            if(rowkeyAnno != null){
    
    
                field.setAccessible(true);
                rowkey = (String)field.get(obj);// 获取到属性的值
            }
        }

         // TODO 3. 获取列和列族
        Put put=new Put(rowkey.getBytes());

        for (Field field : fields) {
    
    
            Column columnAn = field.getAnnotation(Column.class);

            if(columnAn!= null){
    
    
                String family = columnAn.family();
                String column = columnAn.column();

                if(column == null  || column.equals("")){
    
    
                    column = field.getName();//获取到属性的名称
                }
                
                field.setAccessible(true);
                String value=(String)  field.get(obj);
                put.addColumn(Bytes.toBytes(family),Bytes.toBytes( column),Bytes.toBytes(value));
            }

        }
        
        connectionTable.put(put);
        
        connectionTable.close();
    }

Guess you like

Origin blog.csdn.net/First_____/article/details/119955088