package com.lunhan.xxx.common.orm2; import com.lunhan.xxx.common.orm2.enums.ColumnBasic; import com.lunhan.xxx.common.orm2.enums.EnumCondition; import com.lunhan.xxx.common.orm2.models.SqlCondition; import com.lunhan.xxx.common.orm2.models.SqlParameter; import com.lunhan.xxx.common.util.StringUtil; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class ColumnBuilder { public static String getColumnName(String tableName, String columnName) { return tableName + "." + columnName; } public static SqlCondition equal(String columnName, Object value) { return createSqlCondition(EnumCondition.EQUAL, columnName, value); } public static SqlCondition notEqual(String columnName, Object value) { return createSqlCondition(EnumCondition.NOT_EQUAL, columnName, value); } public static SqlCondition lessThan(String columnName, Object value) { return createSqlCondition(EnumCondition.LESS_THAN, columnName, value); } public static SqlCondition lessOrEqual(String columnName, Object value) { return createSqlCondition(EnumCondition.LESS_OR_EQUAL, columnName, value); } public static SqlCondition greaterThan(String columnName, Object value) { return createSqlCondition(EnumCondition.GREATER_THAN, columnName, value); } public static SqlCondition greaterOrEqual(String columnName, Object value) { return createSqlCondition(EnumCondition.GREATER_OR_EQUAL, columnName, value); } public static SqlCondition like(String columnName, Object value) { return createSqlCondition(EnumCondition.LIKE, columnName, "%" + value.toString() + "%"); } public static SqlCondition rightLike(String columnName, Object value) { return createSqlCondition(EnumCondition.LIKE, columnName, value.toString() + "%"); } public static SqlCondition notLike(String columnName, Object value) { return createSqlCondition(EnumCondition.NOT_LIKE, columnName, "%" + value.toString() + "%"); } public static SqlCondition notRightLike(String columnName, Object value) { return createSqlCondition(EnumCondition.NOT_LIKE, columnName, value.toString() + "%"); } public static SqlCondition in(String columnName, Object value) { return createSqlCondition(EnumCondition.IN, columnName, value); } public static SqlCondition notIn(String columnName, Object value) { return createSqlCondition(EnumCondition.NOT_IN, columnName, value); } public static String desc(String columnName) { return columnName + EnumCondition.DESC.getCond(); } public static String asc(String columnName) { return columnName + EnumCondition.ASC.getCond(); } //*******************************************************************// private static SqlCondition createSqlCondition(EnumCondition cond, String columnName, Object value) { String sql = columnName + cond.getCond(); List paramList = new ArrayList<>(); if (value instanceof ColumnBasic) { sql += ((ColumnBasic) value).getColumnName(); paramList.add(new SqlParameter(columnName, value, null)); } else if (value instanceof Collection) { SqlCondition splitResult = splitValue(columnName, ((Collection) value).toArray(), sql); sql = splitResult.getSql(); paramList.addAll(splitResult.getParamList()); } else if (value.getClass().isArray()) { SqlCondition splitResult = splitValue(columnName, value, sql); sql = splitResult.getSql(); paramList.addAll(splitResult.getParamList()); } else { sql += "?"; Integer paramType = SqlUtil.getParameterType(value); paramList.add(new SqlParameter(columnName, value, paramType)); } return new SqlCondition(sql, paramList); } private static SqlCondition splitValue(String columnName, Object value, String sql) { List paramList = new ArrayList<>(); List placeList = new ArrayList<>(); int length = Array.getLength(value); if (length == 0) { return new SqlCondition("(1=2)", paramList); } for (int i = 0; i < length; i++) { Object item = Array.get(value, i); Integer paramType = SqlUtil.getParameterType(item); paramList.add(new SqlParameter(columnName + "_" + i, item, paramType)); placeList.add("?"); } return new SqlCondition(sql + "(" + StringUtil.join(placeList, ",") + ")", paramList); } }