SqlCondBase.java 4.25 KB
Newer Older
yanzg's avatar
yanzg committed
1 2 3 4 5
package com.yanzuoguang.dao.cond;

import com.yanzuoguang.dao.DaoConst;
import com.yanzuoguang.dao.impl.SqlData;
import com.yanzuoguang.dao.impl.SqlDataField;
yanzg's avatar
yanzg committed
6
import com.yanzuoguang.util.base.ObjectHelper;
yanzg's avatar
yanzg committed
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
import com.yanzuoguang.util.exception.CodeException;
import com.yanzuoguang.util.helper.StringHelper;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 包含的值字段
 *
 * @author 颜佐光
 */
public abstract class SqlCondBase implements SqlCond {

    protected List<String> fields = new ArrayList<>();

    /**
     * 构造函数
     *
     * @param fields
     */
    public SqlCondBase(List<String> fields) {
        for (String field : fields) {
            if (!StringHelper.isEmpty(field)) {
                this.fields.add(field);
            }
        }
    }

    /**
     * 判断字段是否相等
     *
     * @param toFields
     * @return
     */
    @Override
    public boolean isField(String... toFields) {
        Map<String, Boolean> fromFields = new HashMap<>();
        for (String fromField : this.fields) {
            String from = fromField.toLowerCase().replaceAll("_", "");
            fromFields.put(from, true);
        }
        for (String toField : toFields) {
            String to = toField.toLowerCase().replaceAll("_", "");
            fromFields.remove(to);
        }
yanzg's avatar
yanzg committed
54
        return fromFields.isEmpty();
yanzg's avatar
yanzg committed
55 56 57
    }

    /**
yanzg's avatar
yanzg committed
58
     * 获取字段值
yanzg's avatar
yanzg committed
59
     *
yanzg's avatar
yanzg committed
60
     * @param model
yanzg's avatar
yanzg committed
61 62
     * @return
     */
yanzg's avatar
yanzg committed
63 64 65 66 67 68 69 70
    @Override
    public List<Object> getValues(Object model) {
        List<Object> rets = new ArrayList<>();
        for (String field : this.fields) {
            rets.add(ObjectHelper.get(model, field));
        }
        return rets;
    }
yanzg's avatar
yanzg committed
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

    /**
     * 当前条件是否相等
     *
     * @param model    请求参数实体
     * @param sqlField 请求字段
     * @return
     */
    protected abstract int getCondType(Object model, SqlDataField sqlField);

    /**
     * 获取新的SQL语句
     *
     * @param sql
     * @param sqlData
yanzg's avatar
yanzg committed
86
     * @param sqlDataField
yanzg's avatar
yanzg committed
87 88 89 90 91
     * @param model
     * @param codeMap
     * @return
     */
    @Override
yanzg's avatar
yanzg committed
92 93
    public String getSql(String sql, SqlData sqlData, SqlDataField sqlDataField, Object model, Map<String, List<String>> codeMap) {
        if (sqlDataField.getCond() != this) {
yanzg's avatar
yanzg committed
94 95
            throw new CodeException("不能处理非本条件的字段");
        }
yanzg's avatar
yanzg committed
96
        int condType = getCondType(model, sqlDataField);
yanzg's avatar
yanzg committed
97 98
        switch (condType) {
            case COND_TYPE_CONST_ONLY_PARA: {
yanzg's avatar
yanzg committed
99 100 101 102
                for (String field : this.fields) {
                    // 进行SQL语句参数替换,后面增加一个空格,方便后续用正则表达式进行替换处理
                    sql = sql.replaceFirst("\\?", "@" + field + " ");
                }
yanzg's avatar
yanzg committed
103 104 105
                break;
            }
            case COND_TYPE_CODE_COND: {
yanzg's avatar
yanzg committed
106
                String fieldName = this.fields.isEmpty() ? StringHelper.EMPTY : this.fields.get(0);
yanzg's avatar
yanzg committed
107
                // 判断代码片段是否合法
yanzg's avatar
yanzg committed
108
                if (sqlDataField.getCodes().size() % 2 == 1) {
yanzg's avatar
yanzg committed
109 110 111
                    throw new CodeException("代码片段" + this.getClass().getSimpleName() + ":" + sqlData.getName() + ":" + fieldName + "为单数");
                }
                // 处理代码片段
yanzg's avatar
yanzg committed
112 113 114
                for (int i = 0; i < sqlDataField.getCodes().size(); i = i + DaoConst.CODE_UNIT) {
                    String codeName = sqlDataField.getCodes().get(i);
                    String codeValue = sqlDataField.getCodes().get(i + 1);
yanzg's avatar
yanzg committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
                    codeValue = codeValue.replaceAll("\\?", "@" + fieldName + " ");
                    addCodeMap(codeMap, codeName, codeValue);
                }
                break;
            }
            case COND_TYPE_NONE:
            default:
                break;
        }
        return sql;
    }


    /**
     * 将代码片段添加到SQL语句中
     *
     * @param codeMap 映射关系
     * @param name    执行的代码片段
     * @param code    代码片段
     */
    protected void addCodeMap(Map<String, List<String>> codeMap, String name, String code) {
        if (!codeMap.containsKey(name)) {
            codeMap.put(name, new ArrayList<String>());
        }
        List<String> arr = codeMap.get(name);
        arr.add(code);
    }
}