SqlData.java 13.9 KB
Newer Older
yanzg's avatar
yanzg committed
1
package com.yanzuoguang.dao.impl;
yanzg's avatar
yanzg committed
2

yanzg's avatar
yanzg committed
3
import com.yanzuoguang.dao.DaoConst;
yanzg's avatar
yanzg committed
4 5
import com.yanzuoguang.dao.cond.SqlCond;
import com.yanzuoguang.dao.cond.SqlCondDefault;
6
import com.yanzuoguang.util.helper.StringFormatHandle;
yanzg's avatar
yanzg committed
7
import com.yanzuoguang.util.helper.StringHelper;
yanzg's avatar
yanzg committed
8

yanzg's avatar
yanzg committed
9 10 11 12 13
import java.util.ArrayList;
import java.util.List;

/**
 * SQL语句基本信息
yanzg's avatar
yanzg committed
14
 *
yanzg's avatar
yanzg committed
15
 * @author 颜佐光
yanzg's avatar
yanzg committed
16 17 18
 */
public class SqlData {

yanzg's avatar
yanzg committed
19 20 21 22 23
    /**
     * SQL语句类型
     */
    private int sqlType = DaoConst.SQL_TYPE_COMMON;

yanzg's avatar
yanzg committed
24 25 26
    /**
     * SQL语句的名称
     */
yanzg's avatar
yanzg committed
27
    private String name;
yanzg's avatar
yanzg committed
28 29 30 31

    /**
     * SQL语句
     */
yanzg's avatar
yanzg committed
32
    private String sql;
yanzg's avatar
yanzg committed
33

yanzg's avatar
yanzg committed
34 35 36 37 38
    /**
     * 对应的参数顺序
     */
    private List<SqlDataField> sqlDataFields = new ArrayList<SqlDataField>();

yanzg's avatar
yanzg committed
39 40 41 42 43 44 45
    /**
     * 构造函数
     */
    public SqlData() {
        this("", "");
    }

yanzg's avatar
yanzg committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
    /**
     * SQL语句的基本信息
     *
     * @param name  SQL语句的名称
     * @param sql   需要执行的SQL语句,其中可以包含大括号括起来的代码片段。 如: {WHERE}
     * @param paras SQL语句参数名称数组
     */
    public SqlData(String name, String sql, String... paras) {
        this.name = name;
        this.sql = sql;
        for (String input : paras) {
            this.add(input);
        }
    }

yanzg's avatar
yanzg committed
61 62
    /**
     * Sql语句类型
yanzg's avatar
yanzg committed
63
     *
yanzg's avatar
yanzg committed
64 65 66 67 68 69 70 71
     * @return Sql语句类型
     */
    public int getSqlType() {
        return sqlType;
    }

    /**
     * Sql语句类型
yanzg's avatar
yanzg committed
72
     *
yanzg's avatar
yanzg committed
73 74
     * @param sqlType Sql语句类型
     */
yanzg's avatar
yanzg committed
75
    public SqlData setSqlType(int sqlType) {
yanzg's avatar
yanzg committed
76
        this.sqlType = sqlType;
yanzg's avatar
yanzg committed
77
        return this;
yanzg's avatar
yanzg committed
78 79
    }

yanzg's avatar
yanzg committed
80 81
    public String getName() {
        return name;
yanzg's avatar
yanzg committed
82 83
    }

84 85 86 87 88 89 90 91 92 93 94

    /**
     * 交换SQL语句中的{LIMIT}和{LIMIT_END}
     *
     * @return
     */
    public SqlData switchLimit() {
        this.sql = StringHelper.getFormat(this.sql, StringHelper.EMPTY, new StringFormatHandle() {
            @Override
            public void addPos(StringBuilder sb, String group, String fieldFull, String field, String command) {
                if (StringHelper.compare(group, DaoConst.CODE_LIMIT)) {
95 96
                    sb.append(DaoConst.CODE_LIMIT_OUTER);
                } else if (StringHelper.compare(group, DaoConst.CODE_LIMIT_OUTER)) {
97 98 99 100 101 102 103 104 105
                    sb.append(DaoConst.CODE_LIMIT);
                } else {
                    sb.append(group);
                }
            }
        });
        return this;
    }

yanzg's avatar
yanzg committed
106 107 108 109 110 111 112 113 114
    /**
     * 设置SQL语句名称
     *
     * @param name SQL语句名称
     * @return
     */
    public SqlData setName(String name) {
        this.name = name;
        return this;
yanzg's avatar
yanzg committed
115 116 117
    }


yanzg's avatar
yanzg committed
118 119
    /**
     * 获取SQL语句
yanzg's avatar
yanzg committed
120
     *
yanzg's avatar
yanzg committed
121 122
     * @return
     */
yanzg's avatar
yanzg committed
123 124 125 126
    public String getSql() {
        return sql;
    }

yanzg's avatar
yanzg committed
127 128
    /**
     * 设置SQL语句
yanzg's avatar
yanzg committed
129
     *
yanzg's avatar
yanzg committed
130 131 132 133
     * @param sql
     * @return
     */
    public SqlData setSql(String sql) {
yanzg's avatar
yanzg committed
134
        this.sql = sql;
yanzg's avatar
yanzg committed
135
        return this;
yanzg's avatar
yanzg committed
136 137
    }

yanzg's avatar
yanzg committed
138
    /**
yanzg's avatar
yanzg committed
139
     * 获取SQL语句字段
yanzg's avatar
yanzg committed
140
     *
yanzg's avatar
yanzg committed
141
     * @return
yanzg's avatar
yanzg committed
142
     */
yanzg's avatar
yanzg committed
143 144 145 146 147 148
    public List<SqlDataField> getSqlDataFields() {
        return sqlDataFields;
    }

    /**
     * 设置SQL语句字段
yanzg's avatar
yanzg committed
149
     *
yanzg's avatar
yanzg committed
150 151 152 153 154 155
     * @param sqlDataFields
     * @return
     */
    public SqlData setSqlDataFields(List<SqlDataField> sqlDataFields) {
        this.sqlDataFields = sqlDataFields;
        return this;
yanzg's avatar
yanzg committed
156 157
    }

yanzg's avatar
yanzg committed
158

yanzg's avatar
yanzg committed
159 160 161 162 163 164 165
    /**
     * 根据字段名称获取字段
     *
     * @param fieldName
     * @return
     */
    public SqlDataField getField(String fieldName) {
yanzg's avatar
yanzg committed
166 167 168 169 170 171 172 173 174 175 176 177
        SqlCondDefault cond = new SqlCondDefault(fieldName);
        return getField(cond);
    }


    /**
     * 根据字段名称获取字段
     *
     * @param sqlCond
     * @return
     */
    public SqlDataField getField(SqlCond sqlCond) {
yanzg's avatar
yanzg committed
178
        for (SqlDataField sqlDataField : this.sqlDataFields) {
yanzg's avatar
yanzg committed
179
            if (sqlDataField.getCond().equals(sqlCond)) {
yanzg's avatar
yanzg committed
180 181 182 183 184 185
                return sqlDataField;
            }
        }
        return null;
    }

yanzg's avatar
yanzg committed
186 187 188 189 190 191 192 193 194 195 196 197 198
    /**
     * 设置所有字段自动
     *
     * @param auto 自动
     * @return
     */
    public SqlData setFieldAuto(boolean auto) {
        for (SqlDataField sqlDataField : this.sqlDataFields) {
            sqlDataField.setAuto(auto);
        }
        return this;
    }

yanzg's avatar
yanzg committed
199 200 201 202 203 204 205
    /**
     * 按照一种类型添加SQL语句
     *
     * @param clsModel 实体
     * @param tag      标签
     * @return
     */
yanzg's avatar
yanzg committed
206 207
    public SqlData add(Class<?> clsModel, String tag, String... codes) {
        return this.add(clsModel, tag, false, codes);
yanzg's avatar
yanzg committed
208 209 210 211 212 213 214 215 216
    }

    /**
     * 按照一种类型添加SQL语句
     *
     * @param clsModel 实体
     * @param tag      标签
     * @return
     */
yanzg's avatar
yanzg committed
217
    public SqlData add(Class<?> clsModel, String tag, boolean removeFlag, String... codes) {
yanzg's avatar
yanzg committed
218 219
        // 生成表结构
        TableStruct table = new TableStruct(StringHelper.EMPTY, clsModel);
yanzg's avatar
yanzg committed
220 221 222 223 224 225 226
        this.add(table, tag, removeFlag, codes);
        return this;
    }

    /**
     * 按照一种类型添加SQL语句
     *
yanzg's avatar
yanzg committed
227 228
     * @param table 实体
     * @param tag   标签
yanzg's avatar
yanzg committed
229 230 231 232 233 234 235 236 237
     * @return
     */
    public SqlData add(TableStruct table, String tag, String... codes) {
        return this.add(table, tag, false, codes);
    }

    /**
     * 按照一种类型添加SQL语句
     *
yanzg's avatar
yanzg committed
238 239
     * @param table 实体
     * @param tag   标签
yanzg's avatar
yanzg committed
240 241 242 243
     * @return
     */
    public SqlData add(TableStruct table, String tag, boolean removeFlag, String... codes) {
        // 生成表结构
yanzg's avatar
yanzg committed
244
        table.addWhereExtend(this, tag, removeFlag, codes);
yanzg's avatar
yanzg committed
245 246 247
        return this;
    }

yanzg's avatar
yanzg committed
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297

    /**
     * 按照一种类型添加SQL语句
     *
     * @param clsModel 实体
     * @param tag      标签
     * @return
     */
    public SqlData addPara(Class<?> clsModel, String codeName, String tag, String... codes) {
        return this.addPara(clsModel, codeName, tag, false, codes);
    }

    /**
     * 按照一种类型添加SQL语句
     *
     * @param clsModel 实体
     * @param tag      标签
     * @return
     */
    public SqlData addPara(Class<?> clsModel, String codeName, String tag, boolean removeFlag, String... codes) {
        // 生成表结构
        TableStruct table = new TableStruct(StringHelper.EMPTY, clsModel);
        this.addPara(table, codeName, tag, removeFlag, codes);
        return this;
    }

    /**
     * 按照一种类型添加SQL语句
     *
     * @param table 实体
     * @param tag   标签
     * @return
     */
    public SqlData addPara(TableStruct table, String codeName, String tag, String... codes) {
        return this.addPara(table, codeName, tag, false, codes);
    }

    /**
     * 按照一种类型添加SQL语句
     *
     * @param table 实体
     * @param tag   标签
     * @return
     */
    public SqlData addPara(TableStruct table, String codeName, String tag, boolean removeFlag, String... codes) {
        // 生成表结构
        table.addWhereExtend(this, codeName, tag, removeFlag, codes);
        return this;
    }

yanzg's avatar
yanzg committed
298 299 300 301 302 303 304 305 306 307 308
    /**
     * 添加参数,当在SQL语句中存在参数时,用于处理。{@id} 代表前台输入参数字段为id
     * 例子:
     * SqlData sql = new SqlData("SQL_NAME","SELECT * FROM TABLE WHERE id=?");
     * sql.add( "id" );
     * 最终SQL语句为:
     * SELECT * FROM TABLE WHERE id={id}"
     *
     * @param paraName 前台参数名称
     */
    public SqlData add(String paraName) {
yanzg's avatar
yanzg committed
309
        return addCodeExecute(getCondDefault(paraName), "", false);
yanzg's avatar
yanzg committed
310 311 312
    }

    /**
yanzg's avatar
yanzg committed
313 314
     * 当前台参数传入值时,在 {WHERE} 条件中增加条件,并增加附加的代码片段
     * <p>
yanzg's avatar
yanzg committed
315 316
     * 例子:
     * SqlData sql = new SqlData("SQL_NAME","SELECT * FROM TABLE {INNER} WHERE 1=1 {WHERE}");
yanzg's avatar
yanzg committed
317 318
     * sql.add("id" , " AND id = ? ",
     * "{INNER}", " INNER JOIN TABLE_B "
yanzg's avatar
yanzg committed
319 320
     * );
     * 最终SQL语句为: (1=1 AND 会自动去掉)
yanzg's avatar
yanzg committed
321
     * SELECT * FROM TABLE INNER JOIN TABLE_B WHERE id = {@id}
yanzg's avatar
yanzg committed
322
     *
yanzg's avatar
yanzg committed
323 324 325
     * @param paraName 前台参数名称
     * @param condSql  {WHERE}代码片段中的条件
     * @param codes    扩展代码片段
yanzg's avatar
yanzg committed
326
     */
yanzg's avatar
yanzg committed
327 328
    public SqlData add(String paraName, String condSql, String... codes) {
        return add(getCondDefault(paraName), condSql, codes);
yanzg's avatar
yanzg committed
329 330 331 332 333 334 335 336 337 338 339 340 341
    }

    /**
     * 当前台参数传入值时,在 {WHERE} 条件中增加条件,并增加附加的代码片段
     * <p>
     * 例子:
     * SqlData sql = new SqlData("SQL_NAME","SELECT * FROM TABLE {INNER} WHERE 1=1 {WHERE}");
     * sql.add("id" , " AND id = ? ",
     * "{INNER}", " INNER JOIN TABLE_B "
     * );
     * 最终SQL语句为: (1=1 AND 会自动去掉)
     * SELECT * FROM TABLE INNER JOIN TABLE_B WHERE id = {@id}
     *
yanzg's avatar
yanzg committed
342 343 344
     * @param cond    前台参数对应的条件
     * @param condSql {WHERE}代码片段中的条件
     * @param codes   扩展代码片段
yanzg's avatar
yanzg committed
345
     */
yanzg's avatar
yanzg committed
346 347
    public SqlData add(SqlCond cond, String condSql, String... codes) {
        return addCodeExecute(cond, condSql, true, codes);
yanzg's avatar
yanzg committed
348 349
    }

yanzg's avatar
yanzg committed
350

yanzg's avatar
yanzg committed
351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
    /**
     * 当前台参数传入值时,增加附加的代码片段
     * <p>
     * 例子:
     * SqlData sql = new SqlData("SQL_NAME","SELECT * FROM TABLE {INNER} WHERE 1=1 {WHERE}");
     * sql.addPara("id" ,
     * "{WHERE}", " AND id = ? ",
     * "{INNER}", " INNER JOIN TABLE_B "
     * );
     * 最终SQL语句为: (1=1 AND 会自动去掉)
     * SELECT * FROM TABLE INNER JOIN TABLE_B WHERE id = {@id}
     *
     * @param paraName 字段
     * @param codes    代码片段
     */
    public SqlData addPara(String paraName, String... codes) {
yanzg's avatar
yanzg committed
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
        return addPara(getCondDefault(paraName), codes);
    }

    /**
     * 当前台参数传入值时,增加附加的代码片段
     * <p>
     * 例子:
     * SqlData sql = new SqlData("SQL_NAME","SELECT * FROM TABLE {INNER} WHERE 1=1 {WHERE}");
     * sql.addPara("id" ,
     * "{WHERE}", " AND id = ? ",
     * "{INNER}", " INNER JOIN TABLE_B "
     * );
     * 最终SQL语句为: (1=1 AND 会自动去掉)
     * SELECT * FROM TABLE INNER JOIN TABLE_B WHERE id = {@id}
     *
     * @param cond  字段
     * @param codes 代码片段
     */
    public SqlData addPara(SqlCond cond, String... codes) {
        return addCodeExecute(cond, "", true, codes);
    }

    /**
     * 添加常规代码片段,即不论如何都会将该代码片段增加到SQL语句中。
     * 例子:
     * SqlData sql = new SqlData("SQL_NAME","SELECT * FROM TABLE {INNER} WHERE 1=1 {WHERE}");
     * sql.addCode(
     * "{INNER}", " INNER JOIN TABLE_B " ,
     * "{WHERE}", " AND 1=1" ,
     * );
     * 最终SQL语句为: (1=1 AND 会自动去掉)
     * SELECT * FROM TABLE INNER JOIN TABLE_B WHERE 1=1"
     *
     * @param codes 代码片段
     */
    public SqlData addCode(String... codes) {
        return addCodeExecute(getCondDefault(StringHelper.EMPTY), "", false, codes);
yanzg's avatar
yanzg committed
404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
    }

    /**
     * 不论前台参数是否有值,在 {WHERE} 条件中增加条件,并增加附加的代码片段
     * <p>
     * 例子:
     * SqlData sql = new SqlData("SQL_NAME","SELECT * FROM TABLE {INNER} WHERE 1=1 {WHERE}");
     * sql.add("id" , " AND id = ? ",
     * "{INNER}", " INNER JOIN TABLE_B "
     * );
     * 最终SQL语句为: (1=1 AND 会自动去掉)
     * SELECT * FROM TABLE INNER JOIN TABLE_B WHERE id = {@id}
     *
     * @param paraName 前台参数名称
     * @param cond     {WHERE}代码片段中的条件
     * @param codes    扩展代码片段
     */
    public SqlData addConst(String paraName, String cond, String... codes) {
yanzg's avatar
yanzg committed
422
        return addCodeExecute(getCondDefault(paraName), cond, false, codes);
yanzg's avatar
yanzg committed
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
    }

    /**
     * 不论前台参数是否有值,增加代码片段
     * <p>
     * 例子:
     * SqlData sql = new SqlData("SQL_NAME","SELECT * FROM TABLE {INNER} WHERE 1=1 {WHERE}");
     * sql.addPara("id" ,
     * "{WHERE}", " AND id = ? ",
     * "{INNER}", " INNER JOIN TABLE_B "
     * );
     * 最终SQL语句为: (1=1 AND 会自动去掉)
     * SELECT * FROM TABLE INNER JOIN TABLE_B WHERE id = {@id}
     *
     * @param paraName 前台参数名称
     * @param codes    代码片段
     */
    public SqlData addParaConst(String paraName, String... codes) {
yanzg's avatar
yanzg committed
441
        return addCodeExecute(getCondDefault(paraName), "", false, codes);
yanzg's avatar
yanzg committed
442 443 444 445 446
    }

    /**
     * 添加SQL语句的执行方法
     *
yanzg's avatar
yanzg committed
447 448 449 450
     * @param condInput 输入条件
     * @param condSql   包含条件的Sql语句
     * @param auto      未false时表示属于必须输入的参数
     * @param codes     代码片段
yanzg's avatar
yanzg committed
451 452
     * @return
     */
yanzg's avatar
yanzg committed
453 454
    private SqlData addCodeExecute(SqlCond condInput, String condSql, boolean auto, String... codes) {
        SqlDataField sql = new SqlDataField(condInput, condSql);
yanzg's avatar
yanzg committed
455
        for (String code : codes) {
yanzg's avatar
yanzg committed
456
            sql.getCodes().add(code);
yanzg's avatar
yanzg committed
457
        }
yanzg's avatar
yanzg committed
458
        sql.setAuto(auto);
yanzg's avatar
yanzg committed
459 460 461 462
        this.sqlDataFields.add(sql);
        return this;
    }

yanzg's avatar
yanzg committed
463

yanzg's avatar
yanzg committed
464 465 466 467 468 469 470
    /**
     * 删除字段
     *
     * @param fieldName 字段名称
     * @return
     */
    public SqlData removeField(String fieldName) {
yanzg's avatar
yanzg committed
471 472 473 474 475 476 477 478 479 480 481 482
        SqlCondDefault cond = new SqlCondDefault(fieldName);
        return this.removeField(cond);
    }

    /**
     * 删除字段
     *
     * @param sqlCond 条件信息
     * @return
     */
    public SqlData removeField(SqlCond sqlCond) {
        SqlDataField field = this.getField(sqlCond);
yanzg's avatar
yanzg committed
483 484 485 486 487 488 489 490 491 492 493 494
        if (field != null) {
            this.sqlDataFields.remove(field);
        }
        return this;
    }

    /**
     * 删除删除标记字段
     *
     * @return
     */
    public SqlData removeFieldRemove() {
yanzg's avatar
yanzg committed
495
        this.removeField(DaoConst.REMOVE_FLAG_INPUT);
yanzg's avatar
yanzg committed
496 497 498 499 500 501 502 503 504 505
        return this;
    }


    /**
     * 将当前SQL语句进行复制
     *
     * @return 复制的结果
     */
    public SqlData copy() {
yanzg's avatar
yanzg committed
506
        SqlData to = new SqlData(this.name, this.sql);
yanzg's avatar
yanzg committed
507 508 509 510 511
        for (SqlDataField sqlDataField : this.sqlDataFields) {
            to.sqlDataFields.add(sqlDataField.copy());
        }
        return to;
    }
yanzg's avatar
yanzg committed
512

yanzg's avatar
yanzg committed
513 514 515 516 517

    /**
     * 条件排序
     */
    public SqlData sortCond() {
yanzg's avatar
yanzg committed
518
        this.sqlDataFields = SqlCondUtil.sortCond(this.sqlDataFields);
yanzg's avatar
yanzg committed
519 520 521
        return this;
    }

yanzg's avatar
yanzg committed
522 523 524 525 526 527 528 529 530
    /**
     * 获取默认条件
     *
     * @param paraName
     * @return
     */
    public static SqlCond getCondDefault(String paraName) {
        return new SqlCondDefault(paraName);
    }
yanzg's avatar
yanzg committed
531
}