liulin
2024-07-29 b65029f9d6e351a714682c110343a8c23eb4e793
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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<SqlParameter> 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<SqlParameter> paramList = new ArrayList<>();
        List<String> 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);
    }
}