All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.xlvchao.clickhouse.util.TableUtil Maven / Gradle / Ivy

package com.xlvchao.clickhouse.util;

import com.xlvchao.clickhouse.annotation.TableName;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.function.Function;

/**
 * 将对象(or对象集合)转成批量执行的sql脚本
 *
 * String s = TableUtil
 *          .create(log)
 *          .create(logs)
 *          .fieldsAll() //转换全部列
 *          .addIncludeFields("field1","filed2") //只包含某些列
 *          .addExcludeFields("field1","filed2") //排除某些列
 *          .addHead((data) -> "hello") //添加头部字段
 *          .addContent() //一个对象(一行)
 *          .addContents() //多个对象(多行)
 *          .addEnding((data) -> "world")
 *          .ToString(); //结果
 *
 * Created by lvchao on 2022/8/1 16:54
 */
public class TableUtil {

    private static String separator = ",";  //默认分隔符
    private StringBuilder str = new StringBuilder();
    private T object;
    private List objects;
    private List excludeFields = new ArrayList(100) {{
        add("serialVersionUID");
    }};
    private List includeFields = new ArrayList(100);
    private boolean fieldsAll = false;
    private  int lineNumber; //行数

    private TableUtil(T object, String separator) {
        this.object = object;
        this.separator = separator;
        //行数
        this.lineNumber =1;
    }
    private TableUtil(T object) {
        this.object = object;
        //行数
        this.lineNumber =1;

    }
    private TableUtil(List objects) {
        if (objects.isEmpty()) {
            throw new NullPointerException("不能是空");
        }
        this.object = objects.get(0);
        this.objects = objects;
        //行数
        this.lineNumber =objects.size();
    }
    private TableUtil(List objects, String separator) {
        if (objects.isEmpty()) {
            throw new NullPointerException("不能是空");
        }
        this.object = objects.get(0);
        this.objects = objects;
        this.separator = separator;
        //行数
        this.lineNumber =objects.size();

    }

    //排除和包含都有,那么以包含的为主
    private boolean decideFields(String fieldName) {
        //包含
        if (includeFields.contains(fieldName)) {
            return false;
        }
        //排除
        if (excludeFields.contains(fieldName)) {
            return true;
        }
        // 开启全部放行
        if (fieldsAll) {
            return false;
        }
        //默认拦截全部
        return true;
    }

    public static  TableUtil create(T object, String separator) {
        return new TableUtil(object, separator);
    }
    public static  TableUtil create(T object) {
        return new TableUtil(object);
    }
    public static  TableUtil create(List object, String separator) {
        return new TableUtil(object, separator);
    }
    public static  TableUtil create(List object) {
        return new TableUtil(object);
    }

    //全部放行
    public TableUtil fieldsAll() {
        fieldsAll = true;
        return this;
    }

    //包含
    public TableUtil addIncludeFields(String... fieldName) {
        includeFields.addAll(Arrays.asList(fieldName));
        return this;
    }

    //排除
    public TableUtil addExcludeFields(String... fieldName) {
        excludeFields.addAll(Arrays.asList(fieldName));
        return this;
    }

    //添加头部
    public TableUtil addHead(Function functor) {
        String apply = functor.apply( this);
        this.str.append(apply);
        return this;
    }

    //天假尾部
    public TableUtil addEnding(Function functor){
        String apply = functor.apply( this);
        this.str.append(apply);
        return this;
    }

    public TableUtil addContent() throws IllegalAccessException {
        StringBuilder str1 = new StringBuilder();
        Class aClass = this.object.getClass();
        Field[] fields = aClass.getDeclaredFields();
        int length = fields.length;
        for (int i = 0; i < length; i++) {
            Field field = fields[i];
            field.setAccessible(true);
            if (decideFields(field.getName())) {
                continue;
            }

            Class type = field.getType();
            Object o = field.get(object);
            String value = "";
            if (o != null) {
                if (type == String.class){
                    value = "'" + String.valueOf(o) + "'";
                } else if(type == Date.class) {
                    value = "'" + DateTimeUtil.formatDate((Date) o) + "'";
                } else {
                    value = String.valueOf(o);
                }
            } else {
                value = null;
            }
            str1.append(value).append(separator);
        }
        int length1 = separator.length();
        String substring = str1.substring(0, str1.length() - length1);
        this.str.append("(").append(substring).append(")");

        return this;
    }

    public TableUtil addContents() throws IllegalAccessException {
        for (T t : this.objects) {
            this.object=t;
            addContent();
            this.str.append(separator);
        }
        this.str.deleteCharAt(this.str.length()-1);
        return this;
    }

    public String ToString() {
        return str.toString();
    }

    public static String getTableColumns(Class clazz) {
        StringBuilder sb = new StringBuilder();
        sb.append("(");

        StringBuilder sbTemp = new StringBuilder();
        Field[] fields = clazz.getDeclaredFields();
        int length = fields.length;
        for (int i = 0; i < length; i++) {
            Field field = fields[i];
            field.setAccessible(true);
            sbTemp.append(field.getName()).append(separator);
        }
        String substring = sbTemp.substring(0, sbTemp.length() - separator.length());

        sb.append(substring).append(")");
        return sb.toString();
    }

    public static String genSqlTemplate(Class clazz) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("INSERT INTO %s %s VALUES ", getTableName(clazz), getTableColumns(clazz)));

        StringBuilder sbTemp = new StringBuilder();
        Field[] fields = clazz.getDeclaredFields();
        int length = fields.length;
        for (int i = 0; i < length; i++) {
            sbTemp.append("?").append(separator);
        }
        String substring = sbTemp.substring(0, sbTemp.length() - separator.length());

        sb.append("(").append(substring).append(")");
        return sb.toString();
    }

    public static String getTableName(Class clazz) {
        if (clazz.isAnnotationPresent(TableName.class)) {
            TableName declaredAnnotation = (TableName) clazz.getDeclaredAnnotation(TableName.class);
            return declaredAnnotation.value();
        }
        return null;
    }

    /*public static void main(String[] args) {
        System.out.println(genSqlTemplate(InterfaceLog.class));
    }*/
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy