场景
注解的实用,当然是为了让我们的代码更具有扩展性, 更加的高大上, 例如将 数据库表与对象添加注解,进行对应.
例如:
我们可以直接将一条半结构化数据经过处理放到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();
}