当往Bean类/数据库中写数据时,如何排除某个字段

第一步:

创建注释接口,在接口声明两个注释

@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版权协议,转载请附上原文出处链接和本声明。