Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.tlgen.orm.utils.SQLGenUtils Maven / Gradle / Ivy
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));
}
}