第一步:
创建注释接口,在接口声明两个注释
@Target(ElementType.FIELD)--注明注释使用范围
@Retention(RetentionPolicy.RUNTIME)--注明何时启用
示例:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TransientSink { }第二步:
之后,在想跳过的字段上声明一个注释@TransientSink
此处注意:注解是个标记,是没有功能的,后续是一个判断的条件而已
示例:
@TransientSink
private String err ;第三步:
最后在代码逻辑中,声明一个offset,运用for循环,如果有注释则减offset数,保证下标正确
示例:其中的accept
public class ClickHouseUtil {
public static <T> SinkFunction <T> getClickHouseSinkFunc(String sql){
return JdbcSink.sink(sql,
new JdbcStatementBuilder<T>() {
@SneakyThrows
@Override
public void accept(PreparedStatement preparedStatement, T t) throws SQLException {
Class<?> tClass = t.getClass();
int offset=0;
Field[] fields = tClass.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
TransientSink annotation = fields[i].getAnnotation(TransientSink.class);
if (annotation==null){
offset++;
continue;
}
Object o = fields[i].get(t);
preparedStatement.setObject(i+1-offset,o);
}
}
}
, JdbcExecutionOptions.builder()
.withBatchSize(10)
.withBatchIntervalMs(100L)
.withMaxRetries(3)
.build()
, new JdbcConnectionOptions.JdbcConnectionOptionsBuilder()
.withUrl(GmallConfig.CLICKHOUSE_URL)
.withDriverName(GmallConfig.PHOENIX_DRIVER)
.build());
}
}版权声明:本文为YyyZzzLllx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。