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

com.tlgen.orm.utils.SQLGenUtils Maven / Gradle / Ivy

The newest version!
package com.tlgen.orm.utils;

import com.tlgen.orm.factory.Model;
import com.tlgen.orm.factory.ModelFactory;
import com.tlgen.orm.factory.QueryOperator;
import com.tlgen.orm.model.PrimaryParams;
import com.tlgen.orm.model.QueryParams;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.BinaryOperator;

import static com.tlgen.orm.constant.SQLScript.*;
import static com.tlgen.orm.factory.QueryFactory.mappingOperator;
import static com.tlgen.orm.utils.ORMUtils.getPrimaryKey;
import static com.tlgen.orm.utils.ORMUtils.getTableName;

public class SQLGenUtils {

    public static  List select(Class tClass) {
        String SQL = SELECT_PREFIX
                .concat(getTableName(tClass))
                .concat(SEPARATOR_SPACE);
        TraceLog.out(SQL);
        return ModelFactory.selectResult(SQL, tClass);
    }

    public static  List select(QueryOperator queryOperator, Class tClass) {
        String SQL = SELECT_PREFIX
                .concat(getTableName(tClass))
                .concat(SEPARATOR_SPACE)
                .concat(mappingOperator(queryOperator.getParamsList()));
        SQL = SQL.replaceFirst("AND", "WHERE")
                .replace("WHERE  GROUP BY", "GROUP BY")
                .replace("WHERE  ORDER BY", "ORDER BY");
        TraceLog.out(SQL);
        return ModelFactory.selectResult(SQL, tClass);
    }

    public static  T selectOne(QueryOperator queryOperator, Class tClass) {
        String SQL = SELECT_PREFIX
                .concat(getTableName(tClass))
                .concat(SEPARATOR_SPACE)
                .concat(mappingOperator(queryOperator.getParamsList()));
        SQL = SQL.replaceFirst("AND", "WHERE")
                .replace("WHERE  GROUP BY", "GROUP BY")
                .replace("WHERE  ORDER BY", "ORDER BY")
                .concat(SEPARATOR_SPACE)
                .concat("LIMIT 1");
        TraceLog.out(SQL);
        return ModelFactory.selectSingleResult(SQL, tClass);
    }

    public static  Object save(Object o) {
        Class aClass = o.getClass();
        PrimaryParams primaryKey = ORMUtils.getPrimaryKey(aClass);
        Object id = null;
        // 收集属性名
        List columns = new ArrayList<>();
        // 收集属性对应的值
        List values = new ArrayList<>();
        for (Field field : aClass.getDeclaredFields()) {
            String fieldName = field.getName();
            Object fieldValue = ReflectUtils.getFieldValue(o, field.getName());
            // 判断是否是主键, 并判断注解属性是否存在自定义值
            if (Objects.equals(primaryKey.getName(), field.getName()) && Objects.isNull(fieldValue)) {
                // 获取分布雪花 ID
                Long aLong = SnowflakeIdWorker.generateId();
                values.add(aLong);
                id = aLong;
            } else {
                values.add(fieldValue);
                id = fieldValue;
            }
            columns.add(fieldName);
        }
        // 处理值
        StringBuffer stringBuffer = new StringBuffer();
        values.forEach(x -> {
            if (null != x) {
                stringBuffer.append(SEPARATOR_SINGLE_QUOTA.concat(String.valueOf(x)).concat("', "));
            } else {
                stringBuffer.append(x).append(", ");
            }
        });
        String bufferString = stringBuffer.toString();
        if (bufferString.length() > 0) {
            bufferString = bufferString.substring(0, stringBuffer.length() - 2);
        }
        // 组装 SQL
        String SQL = INSERT_PREFIX
                .concat(getTableName(aClass))
                .concat(SEPARATOR_OPEN)
                .concat(String.join(SEPARATOR_COMMA, columns))
                .concat(SEPARATOR_CLOSE)
                .concat(INSERT_VALUES)
                .concat(SEPARATOR_OPEN)
                .concat(bufferString)
                .concat(SEPARATOR_CLOSE);
        TraceLog.out(SQL);
        ModelFactory.execute(o, SQL);
        return id;
    }

    public static  void update(QueryOperator queryOperator, Object o) {
        List paramsList = queryOperator.getParamsList();
        // 获取查询条件
        String mappingOperator = mappingOperator(paramsList);
        Class aClass = o.getClass();
        String primaryKeyName = ORMUtils.getPrimaryKey(aClass).getName();
        // 收集属性名
        List columns = new ArrayList<>();
        // 收集属性对应的值
        List values = new ArrayList<>();
        for (Field field : aClass.getDeclaredFields()) {
            String fieldName = field.getName();
            Object fieldValue = ReflectUtils.getFieldValue(o, field.getName());
            if (!Objects.equals(primaryKeyName, fieldName)) {
                values.add(fieldValue);
                columns.add(fieldName);
            }
        }
        // 处理值
        StringBuilder stringBuffer = new StringBuilder();
        for (int i = 0; i < columns.size() && values.get(i) != null; i++) {
            stringBuffer.append(columns.get(i)
                    .concat(SEPARATOR_EQUAL)
                    .concat(SEPARATOR_SINGLE_QUOTA)
                    .concat(String.valueOf(values.get(i)))
                    .concat(SEPARATOR_SINGLE_QUOTA)
                    .concat(SEPARATOR_COMMA)
            );
        }
        String bufferString = stringBuffer.toString();
        if (bufferString.length() > 0) {
            bufferString = bufferString.substring(0, stringBuffer.length() - 2);
        }
        // 组装 SQL
        String SQL = UPDATE_PREFIX
                .concat(getTableName(aClass))
                .concat(UPDATE_SET)
                .concat(bufferString)
                .concat(mappingOperator);
        SQL = SQL.replaceFirst("AND", "WHERE");
        TraceLog.out(SQL);
        ModelFactory.execute(SQL);
    }

    public static  void update(Object o) {
        Class aClass = o.getClass();
        String primaryKeyName = ORMUtils.getPrimaryKey(aClass).getName();
        Object id = null;
        // 收集属性名
        List columns = new ArrayList<>();
        // 收集属性对应的值
        List values = new ArrayList<>();
        for (Field field : aClass.getDeclaredFields()) {
            String fieldName = field.getName();
            Object fieldValue = ReflectUtils.getFieldValue(o, field.getName());
            if (Objects.equals(primaryKeyName, fieldName)) {
                id = fieldValue;
            } else {
                values.add(fieldValue);
                columns.add(fieldName);
            }
        }
        // 处理值
        StringBuilder stringBuffer = new StringBuilder();
        for (int i = 0; i < columns.size(); i++) {
            stringBuffer.append(columns.get(i)
                    .concat(SEPARATOR_EQUAL)
                    .concat(SEPARATOR_SINGLE_QUOTA)
                    .concat(Objects.nonNull(values.get(i)) ? String.valueOf(values.get(i)) : "null")
                    .concat(SEPARATOR_SINGLE_QUOTA)
                    .concat(SEPARATOR_COMMA)
            );
        }
        String bufferString = stringBuffer.toString();
        if (bufferString.length() > 0) {
            bufferString = bufferString.substring(0, stringBuffer.length() - 2);
        }
        // 组装 SQL
        String SQL = UPDATE_PREFIX
                .concat(getTableName(aClass))
                .concat(UPDATE_SET)
                .concat(bufferString)
                .concat(SEPARATOR_WHERE)
                .concat(primaryKeyName)
                .concat(SEPARATOR_EQUAL)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(id))
                .concat(SEPARATOR_SINGLE_QUOTA);
        SQL = SQL.replaceAll("'null'", "null");
        TraceLog.out(SQL);
        ModelFactory.execute(SQL);
    }

    public static  void deleteById(Object id, Class tClass) {
        String key = getPrimaryKey(tClass).getName();
        String SQL = DELETE_PREFIX
                .concat(getTableName(tClass)
                        .concat(SEPARATOR_WHERE)
                        .concat(key)
                        .concat(SEPARATOR_EQUAL)
                        .concat(SEPARATOR_SINGLE_QUOTA.concat(String.valueOf(id)).concat(SEPARATOR_SINGLE_QUOTA)));
        System.out.println(SQL);
        ModelFactory.execute(SQL);
    }

    public static  void delete(Class tclass) {
        String SQL = DELETE_PREFIX.concat(getTableName(tclass));
        System.out.println(SQL);
        ModelFactory.execute(SQL);
    }

    public static  void delete(QueryOperator operator, Class tclass) {
        List paramsList = operator.getParamsList();
        // 获取查询条件
        String mappingOperator = mappingOperator(paramsList).replaceFirst("AND", "WHERE");
        String SQL = DELETE_PREFIX.concat(getTableName(tclass)).concat(mappingOperator);
        System.out.println(SQL);
        ModelFactory.execute(SQL);
    }

    public static  T selectById(Object id, Class tClass) {
        String key = getPrimaryKey(tClass).getName();
        String SQL = SELECT_PREFIX.concat(getTableName(tClass)
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_WHERE)
                .concat(key)
                .concat(SEPARATOR_EQUAL)
                .concat(SEPARATOR_SINGLE_QUOTA.concat(String.valueOf(id)).concat(SEPARATOR_SINGLE_QUOTA)));
        TraceLog.out(SQL);
        return ModelFactory.selectSingleResult(SQL, tClass);
    }

    public static  void saveBatch(List tList) {
        List stringList = new ArrayList<>();
        for (T o : tList) {
            String INNER_SQL = selectInnerSQL(o);
            stringList.add(INNER_SQL);
        }
        // 分片插入(每 1000 条执行一次批量插入)
        int batchSize = 1000;
        int total = stringList.size();
        // 需要执行的次数
        int insertTimes = total / batchSize;
        // 最后一次执行需要提交的记录数(防止可能不足 1000 条)
        int lastSize = batchSize;
        if (total % batchSize != 0) {
            insertTimes++;
            lastSize = total % batchSize;
        }
        for (int j = 0; j < insertTimes; j++) {
            if (insertTimes == j + 1) {
                batchSize = lastSize;
            }
            List subList = stringList.subList(j * batchSize, (j * batchSize + batchSize));
            String saveBatchPrefix = "";
            List valueList = new ArrayList<>();
            for (String s : subList) {
                String[] split = s.split("VALUES");
                valueList.add(split[1]);
                saveBatchPrefix = split[0];
            }
            String SQL = saveBatchPrefix.concat(INSERT_VALUES).concat(String.join(",", valueList));
            TraceLog.out(SQL);
            // 分片执行批量插入
            ModelFactory.execute(SQL);
        }
    }

    private static  String selectInnerSQL(T o) {
        Class aClass = o.getClass();
        PrimaryParams primaryKey = ORMUtils.getPrimaryKey(aClass);
        // 收集属性名
        List columns = new ArrayList<>();
        // 收集属性对应的值
        List values = new ArrayList<>();
        for (Field field : aClass.getDeclaredFields()) {
            String fieldName = field.getName();
            Object fieldValue = ReflectUtils.getFieldValue(o, field.getName());
            // 判断是否是主键, 并判断注解属性是否存在自定义值
            if (Objects.equals(primaryKey.getName(), field.getName()) && Objects.isNull(fieldValue)) {
                // 获取分布雪花 ID
                Long aLong = SnowflakeIdWorker.generateId();
                values.add(aLong);
            } else {
                values.add(fieldValue);
            }
            columns.add(fieldName);
        }
        // 处理值
        StringBuffer stringBuffer = new StringBuffer();
        values.forEach(x -> {
            if (null != x) {
                stringBuffer.append(SEPARATOR_SINGLE_QUOTA.concat(String.valueOf(x)).concat("', "));
            } else {
                stringBuffer.append(x).append(", ");
            }
        });
        String bufferString = stringBuffer.toString();
        if (bufferString.length() > 0) {
            bufferString = bufferString.substring(0, stringBuffer.length() - 2);
        }
        // 组装 SQL
        return INSERT_PREFIX
                .concat(getTableName(aClass))
                .concat(SEPARATOR_OPEN)
                .concat(String.join(SEPARATOR_COMMA, columns))
                .concat(SEPARATOR_CLOSE)
                .concat(INSERT_VALUES)
                .concat(SEPARATOR_OPEN)
                .concat(bufferString)
                .concat(SEPARATOR_CLOSE);
    }

    public static  List selectPage(Integer pageNum, Integer pageSize, QueryOperator queryOperator, Class tClass) {
        String SQL = SELECT_PREFIX
                .concat(getTableName(tClass))
                .concat(SEPARATOR_SPACE)
                .concat(mappingOperator(queryOperator.getParamsList()));
        SQL = SQL.replaceFirst("AND", "WHERE")
                .replace("WHERE  GROUP BY", "GROUP BY")
                .replace("WHERE  ORDER BY", "ORDER BY");
        BinaryOperator multiply = (x, y) -> (x - 1) * y;
        SQL = SQL.concat(SEPARATOR_LIMIT)
                .concat(String.valueOf(multiply.apply(pageNum, pageSize)))
                .concat(SEPARATOR_COMMA)
                .concat(String.valueOf(pageSize));
        TraceLog.out(SQL);
        return ModelFactory.selectResult(SQL, tClass);
    }

    public static  List tTree(Class tClass) {
        return TreeUtils.tTree(Model.select(tClass));
    }

}