refactor: 提取 SQL 构建时的常量。

This commit is contained in:
Suomm 2023-06-13 21:53:29 +08:00
parent 7473cc6115
commit f134705ce7
26 changed files with 634 additions and 451 deletions

View File

@ -0,0 +1,131 @@
/*
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mybatisflex.core.constant;
/**
* SQL 构建常量池
*
* @author 王帅
* @since 2023-06-12
*/
public final class SqlConsts {
public static final String EMPTY = "";
// === 常用符号 ===
public static final String BLANK = " ";
public static final String ASTERISK = "*";
public static final String REFERENCE = ".";
public static final String SEMICOLON = ";";
public static final String DELIMITER = ", ";
public static final String PLACEHOLDER = "?";
public static final String PERCENT_SIGN = "%";
public static final String SINGLE_QUOTE = "'";
public static final String LEFT_BRACKET = "(";
public static final String RIGHT_BRACKET = ")";
public static final String HINT_START = "/*+ ";
// === SQL 关键字 ===
public static final String HINT_END = " */ ";
public static final String AS = " AS ";
public static final String OR = " OR ";
public static final String END = " END";
public static final String AND = " AND ";
public static final String SET = " SET ";
public static final String CASE = "CASE";
public static final String WHEN = " WHEN ";
public static final String THEN = " THEN ";
public static final String ELSE = " ELSE ";
public static final String FROM = " FROM ";
public static final String WHERE = " WHERE ";
public static final String SELECT = "SELECT ";
public static final String VALUES = " VALUES ";
public static final String DELETE = "DELETE";
public static final String UPDATE = "UPDATE ";
public static final String HAVING = " HAVING ";
public static final String DISTINCT = "DISTINCT ";
public static final String GROUP_BY = " GROUP BY ";
public static final String ORDER_BY = " ORDER BY ";
public static final String INSERT = "INSERT";
public static final String INTO = " INTO ";
public static final String INSERT_INTO = INSERT + INTO;
public static final String DELETE_FROM = DELETE + FROM;
public static final String SELECT_ALL_FROM = SELECT + ASTERISK + FROM;
public static final String INSERT_ALL = "INSERT ALL ";
// === Oracle SQl ===
public static final String INSERT_ALL_END = " SELECT 1 FROM DUAL";
public static final String ON = " ON ";
// === 联表查询关键字 ===
public static final String JOIN = " JOIN ";
public static final String UNION = " UNION ";
public static final String UNION_ALL = " UNION ALL ";
public static final String LEFT_JOIN = " LEFT JOIN ";
public static final String FULL_JOIN = " FULL JOIN ";
public static final String RIGHT_JOIN = " RIGHT JOIN ";
public static final String INNER_JOIN = " INNER JOIN ";
public static final String CROSS_JOIN = " CROSS JOIN ";
public static final String GT = " > ";
// === 逻辑符号 ===
public static final String GE = " >= ";
public static final String LT = " < ";
public static final String LE = " <= ";
public static final String NOT = " NOT ";
public static final String LIKE = " LIKE ";
public static final String EQUALS = " = ";
public static final String NOT_EQUALS = " != ";
public static final String IS_NULL = " IS NULL ";
public static final String IS_NOT_NULL = " IS NOT NULL ";
public static final String IN = " IN ";
public static final String NOT_IN = " NOT IN ";
public static final String BETWEEN = " BETWEEN ";
public static final String NOT_BETWEEN = " NOT BETWEEN ";
public static final String EXISTS = " EXISTS ";
public static final String NOT_EXISTS = " NOT EXISTS ";
public static final String ASC = " ASC";
// === 排序相关关键字 ===
public static final String DESC = " DESC";
public static final String NULLS_FIRST = " NULLS FIRST";
public static final String NULLS_LAST = " NULLS LAST";
public static final String SUM = "SUM";
// === SQL 函数名 ===
public static final String MAX = "MIX";
public static final String MIN = "MIN";
public static final String AVG = "AVG";
public static final String DAY = "DAY";
public static final String YEAR = "YEAR";
public static final String MONTH = "MONTH";
public static final String COUNT = "COUNT";
public static final String CONVERT = "CONVERT";
public static final String PLUS_SIGN = " + ";
// === 数学运算符 ===
public static final String MINUS_SIGN = " - ";
public static final String DIVISION_SIGN = " / ";
public static final String MULTIPLICATION_SIGN = " * ";
public static final String EQUALS_PLACEHOLDER = " = ? ";
// === 其他拼接需要的字符串 ===
public static final String AND_PLACEHOLDER = BLANK + PLACEHOLDER + AND + PLACEHOLDER + BLANK;
private SqlConsts() {
}
}

View File

@ -1,20 +1,21 @@
/**
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
/*
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mybatisflex.core.dialect;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.util.StringUtil;
import java.util.Collections;
@ -88,7 +89,7 @@ public class KeywordWrap {
}
public String wrap(String keyword) {
if (StringUtil.isBlank(keyword) || "*".equals(keyword)) {
if (StringUtil.isBlank(keyword) || SqlConsts.ASTERISK.equals(keyword)) {
return keyword;
}
if (caseSensitive || keywords.isEmpty() || keywords.contains(keyword.toUpperCase(Locale.ENGLISH))) {

View File

@ -1,17 +1,17 @@
/**
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
/*
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mybatisflex.core.dialect.impl;
@ -35,6 +35,8 @@ import java.util.Map;
import java.util.Set;
import java.util.StringJoiner;
import static com.mybatisflex.core.constant.SqlConsts.*;
/**
* 通用的方言设计其他方言可以继承于当前 CommonsDialectImpl
* 创建或获取方言请参考 {@link com.mybatisflex.core.dialect.DialectFactory}
@ -58,13 +60,13 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String wrap(String keyword) {
return "*".equals(keyword) ? keyword : keywordWrap.wrap(keyword);
return ASTERISK.equals(keyword) ? keyword : keywordWrap.wrap(keyword);
}
@Override
public String forHint(String hintString) {
return StringUtil.isNotBlank(hintString) ? "/*+ " + hintString + " */ " : "";
return StringUtil.isNotBlank(hintString) ? HINT_START + hintString + HINT_END : EMPTY;
}
@Override
@ -76,21 +78,21 @@ public class CommonsDialectImpl implements IDialect {
int index = 0;
for (String attr : attrs) {
fields.append(wrap(attr));
questions.append("?");
questions.append(PLACEHOLDER);
if (index != attrs.size() - 1) {
fields.append(", ");
questions.append(", ");
fields.append(DELIMITER);
questions.append(DELIMITER);
}
index++;
}
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO ");
sql.append(INSERT_INTO);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(".");
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
}
sql.append(wrap(getRealTable(tableName)));
sql.append("(").append(fields).append(") ");
sql.append(" VALUES ").append("(").append(questions).append(")");
sql.append(LEFT_BRACKET).append(fields).append(RIGHT_BRACKET);
sql.append(VALUES).append(LEFT_BRACKET).append(questions).append(RIGHT_BRACKET);
return sql.toString();
}
@ -106,27 +108,29 @@ public class CommonsDialectImpl implements IDialect {
for (String column : attrs) {
fields.append(wrap(column));
if (index != attrs.size() - 1) {
fields.append(", ");
fields.append(DELIMITER);
}
index++;
}
for (int i = 0; i < rows.size(); i++) {
questions.append(buildQuestion(attrs.size(), true));
questions.append(buildQuestion(attrs.size()));
if (i != rows.size() - 1) {
questions.append(",");
questions.append(DELIMITER);
}
}
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO ");
sql.append(INSERT_INTO);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(".");
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
}
sql.append(wrap(getRealTable(tableName)));
sql.append(" (").append(fields).append(") ");
sql.append(" VALUES ").append(questions);
sql.append(BLANK).append(LEFT_BRACKET)
.append(fields)
.append(RIGHT_BRACKET).append(BLANK);
sql.append(VALUES).append(questions);
return sql.toString();
}
@ -134,17 +138,17 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forDeleteById(String schema, String tableName, String[] primaryKeys) {
StringBuilder sql = new StringBuilder();
sql.append("DELETE FROM ");
sql.append(DELETE_FROM);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(".");
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
}
sql.append(wrap(getRealTable(tableName)));
sql.append(" WHERE ");
sql.append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) {
if (i > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(primaryKeys[i])).append(" = ?");
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
}
return sql.toString();
}
@ -153,36 +157,36 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forDeleteBatchByIds(String schema, String tableName, String[] primaryKeys, Object[] ids) {
StringBuilder sql = new StringBuilder();
sql.append("DELETE FROM ");
sql.append(DELETE_FROM);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(".");
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
}
sql.append(wrap(getRealTable(tableName)));
sql.append(" WHERE ");
sql.append(WHERE);
//多主键的场景
if (primaryKeys.length > 1) {
for (int i = 0; i < ids.length / primaryKeys.length; i++) {
if (i > 0) {
sql.append(" OR ");
sql.append(OR);
}
sql.append("(");
sql.append(LEFT_BRACKET);
for (int j = 0; j < primaryKeys.length; j++) {
if (j > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(primaryKeys[j])).append(" = ?");
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
}
sql.append(")");
sql.append(RIGHT_BRACKET);
}
}
// 单主键
else {
for (int i = 0; i < ids.length; i++) {
if (i > 0) {
sql.append(" OR ");
sql.append(OR);
}
sql.append(wrap(primaryKeys[0])).append(" = ?");
sql.append(wrap(primaryKeys[0])).append(EQUALS_PLACEHOLDER);
}
}
return sql.toString();
@ -200,28 +204,28 @@ public class CommonsDialectImpl implements IDialect {
Set<String> modifyAttrs = row.obtainModifyAttrs();
String[] primaryKeys = RowCPI.obtainsPrimaryKeyStrings(row);
sql.append("UPDATE ");
sql.append(UPDATE);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(".");
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
}
sql.append(wrap(getRealTable(tableName))).append(" SET ");
sql.append(wrap(getRealTable(tableName))).append(SET);
int index = 0;
for (Map.Entry<String, Object> e : row.entrySet()) {
String colName = e.getKey();
if (modifyAttrs.contains(colName) && !ArrayUtil.contains(primaryKeys, colName)) {
if (index > 0) {
sql.append(", ");
sql.append(DELIMITER);
}
sql.append(wrap(colName)).append(" = ? ");
sql.append(wrap(colName)).append(EQUALS_PLACEHOLDER);
index++;
}
}
sql.append(" WHERE ");
sql.append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) {
if (i > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(primaryKeys[i])).append(" = ?");
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
}
return sql.toString();
@ -241,19 +245,19 @@ public class CommonsDialectImpl implements IDialect {
//fix: support schema
QueryTable queryTable = queryTables.get(0);
// String tableName = queryTables.get(0).getName();
sql.append("UPDATE ").append(queryTable.toSql(this)).append(" SET ");
sql.append(UPDATE).append(queryTable.toSql(this)).append(SET);
int index = 0;
for (String modifyAttr : modifyAttrs) {
if (index > 0) {
sql.append(", ");
sql.append(DELIMITER);
}
sql.append(wrap(modifyAttr)).append(" = ? ");
sql.append(wrap(modifyAttr)).append(EQUALS_PLACEHOLDER);
index++;
}
String whereConditionSql = buildWhereConditionSql(queryWrapper);
if (StringUtil.isNotBlank(whereConditionSql)) {
sql.append(" WHERE ").append(whereConditionSql);
sql.append(WHERE).append(whereConditionSql);
}
return sql.toString();
@ -266,7 +270,7 @@ public class CommonsDialectImpl implements IDialect {
}
StringBuilder sql = new StringBuilder();
for (Row row : rows) {
sql.append(forUpdateById(schema, tableName, row)).append("; ");
sql.append(forUpdateById(schema, tableName, row)).append(SEMICOLON).append(BLANK);
}
return sql.toString();
}
@ -274,16 +278,16 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forSelectOneById(String schema, String tableName, String[] primaryKeys, Object[] primaryValues) {
StringBuilder sql = new StringBuilder("SELECT * FROM ");
StringBuilder sql = new StringBuilder(SELECT_ALL_FROM);
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(".");
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
}
sql.append(wrap(getRealTable(tableName))).append(" WHERE ");
sql.append(wrap(getRealTable(tableName))).append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) {
if (i > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(primaryKeys[i])).append(" = ?");
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
}
return sql.toString();
}
@ -304,7 +308,7 @@ public class CommonsDialectImpl implements IDialect {
List<QueryColumn> selectColumns = CPI.getSelectColumns(queryWrapper);
StringBuilder sqlBuilder = buildSelectColumnSql(allTables, selectColumns, CPI.getHint(queryWrapper));
sqlBuilder.append(" FROM ").append(StringUtil.join(", ", queryTables, queryTable -> queryTable.toSql(this)));
sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this)));
buildJoinSql(sqlBuilder, queryWrapper, allTables);
buildWhereSql(sqlBuilder, queryWrapper, allTables, true);
@ -314,7 +318,7 @@ public class CommonsDialectImpl implements IDialect {
List<UnionWrapper> unions = CPI.getUnions(queryWrapper);
if (CollectionUtil.isNotEmpty(unions)) {
sqlBuilder.insert(0, "(").append(")");
sqlBuilder.insert(0, LEFT_BRACKET).append(RIGHT_BRACKET);
for (UnionWrapper unionWrapper : unions) {
unionWrapper.buildSql(sqlBuilder, this);
}
@ -329,7 +333,7 @@ public class CommonsDialectImpl implements IDialect {
List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) {
for (String endFragment : endFragments) {
sqlBuilder.append(" ").append(endFragment);
sqlBuilder.append(BLANK).append(endFragment);
}
}
@ -337,17 +341,17 @@ public class CommonsDialectImpl implements IDialect {
}
private StringBuilder buildSelectColumnSql(List<QueryTable> queryTables, List<QueryColumn> selectColumns, String hint) {
StringBuilder sqlBuilder = new StringBuilder("SELECT ");
StringBuilder sqlBuilder = new StringBuilder(SELECT);
sqlBuilder.append(forHint(hint));
if (selectColumns == null || selectColumns.isEmpty()) {
sqlBuilder.append("*");
sqlBuilder.append(ASTERISK);
} else {
int index = 0;
for (QueryColumn selectColumn : selectColumns) {
String selectColumnSql = CPI.toSelectSql(selectColumn, queryTables, this);
sqlBuilder.append(selectColumnSql);
if (index != selectColumns.size() - 1) {
sqlBuilder.append(", ");
sqlBuilder.append(DELIMITER);
}
index++;
}
@ -363,8 +367,12 @@ public class CommonsDialectImpl implements IDialect {
List<QueryTable> allTables = CollectionUtil.merge(queryTables, joinTables);
//ignore selectColumns
StringBuilder sqlBuilder = new StringBuilder("DELETE " + forHint(CPI.getHint(queryWrapper)) + "FROM ");
sqlBuilder.append(StringUtil.join(", ", queryTables, queryTable -> queryTable.toSql(this)));
StringBuilder sqlBuilder = new StringBuilder(DELETE);
String hint = CPI.getHint(queryWrapper);
if (StringUtil.isNotBlank(hint)) {
sqlBuilder.append(BLANK).append(hint).deleteCharAt(sqlBuilder.length() - 1);
}
sqlBuilder.append(FROM).append(StringUtil.join(DELIMITER, queryTables, queryTable -> queryTable.toSql(this)));
buildJoinSql(sqlBuilder, queryWrapper, allTables);
buildWhereSql(sqlBuilder, queryWrapper, allTables, false);
@ -378,7 +386,7 @@ public class CommonsDialectImpl implements IDialect {
List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) {
for (String endFragment : endFragments) {
sqlBuilder.append(" ").append(endFragment);
sqlBuilder.append(BLANK).append(endFragment);
}
}
@ -388,60 +396,63 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String buildWhereConditionSql(QueryWrapper queryWrapper) {
QueryCondition whereQueryCondition = CPI.getWhereQueryCondition(queryWrapper);
return whereQueryCondition != null ? whereQueryCondition.toSql(CPI.getQueryTables(queryWrapper), this) : "";
return whereQueryCondition != null ? whereQueryCondition.toSql(CPI.getQueryTables(queryWrapper), this) : EMPTY;
}
@Override
public String forInsertEntity(TableInfo tableInfo, Object entity, boolean ignoreNulls) {
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO ").append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this));
String[] insertColumns = tableInfo.obtainInsertColumns(entity, ignoreNulls);
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
StringJoiner sqlFields = new StringJoiner(", ");
StringJoiner sqlValues = new StringJoiner(", ");
StringJoiner sqlFields = new StringJoiner(DELIMITER);
StringJoiner sqlValues = new StringJoiner(DELIMITER);
for (String insertColumn : insertColumns) {
sqlFields.add(wrap(insertColumn));
if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
sqlValues.add(onInsertColumns.get(insertColumn));
} else {
sqlValues.add("?");
sqlValues.add(PLACEHOLDER);
}
}
return sql.append("(").append(sqlFields).append(")")
.append(" VALUES ")
.append("(").append(sqlValues).append(")").toString();
return sql.append(LEFT_BRACKET).append(sqlFields).append(RIGHT_BRACKET)
.append(VALUES)
.append(LEFT_BRACKET).append(sqlValues).append(RIGHT_BRACKET)
.toString();
}
@Override
public String forInsertEntityBatch(TableInfo tableInfo, List<?> entities) {
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO ").append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(INSERT_INTO).append(tableInfo.getWrapSchemaAndTableName(this));
String[] insertColumns = tableInfo.obtainInsertColumns(null, false);
String[] warpedInsertColumns = new String[insertColumns.length];
for (int i = 0; i < insertColumns.length; i++) {
warpedInsertColumns[i] = wrap(insertColumns[i]);
}
sql.append("(").append(StringUtil.join(", ", warpedInsertColumns)).append(")");
sql.append(" VALUES ");
sql.append(LEFT_BRACKET)
.append(StringUtil.join(DELIMITER, warpedInsertColumns))
.append(RIGHT_BRACKET);
sql.append(VALUES);
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
for (int i = 0; i < entities.size(); i++) {
StringJoiner stringJoiner = new StringJoiner(", ", "(", ")");
StringJoiner stringJoiner = new StringJoiner(DELIMITER, LEFT_BRACKET, RIGHT_BRACKET);
for (String insertColumn : insertColumns) {
if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
//直接读取 onInsert 配置的值而不用 "?" 代替
stringJoiner.add(onInsertColumns.get(insertColumn));
} else {
stringJoiner.add("?");
stringJoiner.add(PLACEHOLDER);
}
}
sql.append(stringJoiner);
if (i != entities.size() - 1) {
sql.append(", ");
sql.append(DELIMITER);
}
}
@ -457,7 +468,7 @@ public class CommonsDialectImpl implements IDialect {
String deleteByIdSql = forDeleteById(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getPrimaryKeys());
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
deleteByIdSql += " AND " + wrap(tableInfo.getTenantIdColumn()) + " IN " + buildQuestion(tenantIdArgs.length, true);
deleteByIdSql += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length);
}
return deleteByIdSql;
}
@ -466,21 +477,21 @@ public class CommonsDialectImpl implements IDialect {
StringBuilder sql = new StringBuilder();
String[] primaryKeys = tableInfo.getPrimaryKeys();
sql.append("UPDATE ").append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(" SET ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicDeletedValue());
sql.append(" WHERE ");
sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(SET).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicDeletedValue());
sql.append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) {
if (i > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(primaryKeys[i])).append(" = ?");
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
}
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
sql.append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
//租户ID
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN ").append(buildQuestion(tenantIdArgs.length, true));
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
return sql.toString();
@ -498,18 +509,18 @@ public class CommonsDialectImpl implements IDialect {
//多租户
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
deleteSQL = deleteSQL.replace(" WHERE ", " WHERE (") + ")";
deleteSQL += " AND " + wrap(tableInfo.getTenantIdColumn()) + " IN " + buildQuestion(tenantIdArgs.length, true);
deleteSQL = deleteSQL.replace(WHERE, WHERE + LEFT_BRACKET) + RIGHT_BRACKET;
deleteSQL += AND + wrap(tableInfo.getTenantIdColumn()) + IN + buildQuestion(tenantIdArgs.length);
}
return deleteSQL;
}
StringBuilder sql = new StringBuilder();
sql.append("UPDATE ");
sql.append(UPDATE);
sql.append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(" SET ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicDeletedValue());
sql.append(" WHERE ");
sql.append("(");
sql.append(SET).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicDeletedValue());
sql.append(WHERE);
sql.append(LEFT_BRACKET);
String[] primaryKeys = tableInfo.getPrimaryKeys();
@ -517,32 +528,32 @@ public class CommonsDialectImpl implements IDialect {
if (primaryKeys.length > 1) {
for (int i = 0; i < primaryValues.length / primaryKeys.length; i++) {
if (i > 0) {
sql.append(" OR ");
sql.append(OR);
}
sql.append("(");
sql.append(LEFT_BRACKET);
for (int j = 0; j < primaryKeys.length; j++) {
if (j > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(primaryKeys[j])).append(" = ?");
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
}
sql.append(")");
sql.append(RIGHT_BRACKET);
}
}
// 单主键
else {
for (int i = 0; i < primaryValues.length; i++) {
if (i > 0) {
sql.append(" OR ");
sql.append(OR);
}
sql.append(wrap(primaryKeys[0])).append(" = ?");
sql.append(wrap(primaryKeys[0])).append(EQUALS_PLACEHOLDER);
}
}
sql.append(") AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
sql.append(RIGHT_BRACKET).append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN ").append(buildQuestion(tenantIdArgs.length, true));
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
return sql.toString();
@ -565,9 +576,9 @@ public class CommonsDialectImpl implements IDialect {
List<QueryTable> allTables = CollectionUtil.merge(queryTables, joinTables);
//ignore selectColumns
StringBuilder sqlBuilder = new StringBuilder("UPDATE ").append(forHint(CPI.getHint(queryWrapper)));
StringBuilder sqlBuilder = new StringBuilder(UPDATE).append(forHint(CPI.getHint(queryWrapper)));
sqlBuilder.append(tableInfo.getWrapSchemaAndTableName(this));
sqlBuilder.append(" SET ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicDeletedValue());
sqlBuilder.append(SET).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicDeletedValue());
buildJoinSql(sqlBuilder, queryWrapper, allTables);
@ -590,39 +601,39 @@ public class CommonsDialectImpl implements IDialect {
Set<String> modifyAttrs = tableInfo.obtainUpdateColumns(entity, ignoreNulls, false);
String[] primaryKeys = tableInfo.getPrimaryKeys();
sql.append("UPDATE ").append(tableInfo.getWrapSchemaAndTableName(this)).append(" SET ");
sql.append(UPDATE).append(tableInfo.getWrapSchemaAndTableName(this)).append(SET);
StringJoiner stringJoiner = new StringJoiner(", ");
StringJoiner stringJoiner = new StringJoiner(DELIMITER);
for (String modifyAttr : modifyAttrs) {
stringJoiner.add(wrap(modifyAttr) + " = ?");
stringJoiner.add(wrap(modifyAttr) + EQUALS_PLACEHOLDER);
}
Map<String, String> onUpdateColumns = tableInfo.getOnUpdateColumns();
if (onUpdateColumns != null && !onUpdateColumns.isEmpty()) {
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + " = " + value));
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + EQUALS + value));
}
//乐观锁字段
String versionColumn = tableInfo.getVersionColumn();
if (StringUtil.isNotBlank(versionColumn)) {
stringJoiner.add(wrap(versionColumn) + " = " + wrap(versionColumn) + " + 1 ");
stringJoiner.add(wrap(versionColumn) + EQUALS + wrap(versionColumn) + " + 1 ");
}
sql.append(stringJoiner);
sql.append(" WHERE ");
sql.append(WHERE);
for (int i = 0; i < primaryKeys.length; i++) {
if (i > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(primaryKeys[i])).append(" = ?");
sql.append(wrap(primaryKeys[i])).append(EQUALS_PLACEHOLDER);
}
//逻辑删除条件已删除的数据不能被修改
String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
if (StringUtil.isNotBlank(logicDeleteColumn)) {
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
sql.append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
}
@ -630,9 +641,9 @@ public class CommonsDialectImpl implements IDialect {
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
if (tenantIdArgs.length == 1) {
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" = ?");
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(EQUALS_PLACEHOLDER);
} else {
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN ").append(buildQuestion(tenantIdArgs.length, true));
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
}
@ -642,7 +653,7 @@ public class CommonsDialectImpl implements IDialect {
if (versionValue == null) {
throw FlexExceptions.wrap("The version value of entity[%s] must not be null.", entity);
}
sql.append(" AND ").append(wrap(versionColumn)).append(" = ").append(versionValue);
sql.append(AND).append(wrap(versionColumn)).append(EQUALS).append(versionValue);
}
@ -655,24 +666,24 @@ public class CommonsDialectImpl implements IDialect {
Set<String> modifyAttrs = tableInfo.obtainUpdateColumns(entity, ignoreNulls, true);
sql.append("UPDATE ").append(forHint(CPI.getHint(queryWrapper)))
.append(tableInfo.getWrapSchemaAndTableName(this)).append(" SET ");
sql.append(UPDATE).append(forHint(CPI.getHint(queryWrapper)))
.append(tableInfo.getWrapSchemaAndTableName(this)).append(SET);
StringJoiner stringJoiner = new StringJoiner(", ");
StringJoiner stringJoiner = new StringJoiner(DELIMITER);
for (String modifyAttr : modifyAttrs) {
stringJoiner.add(wrap(modifyAttr) + " = ?");
stringJoiner.add(wrap(modifyAttr) + EQUALS_PLACEHOLDER);
}
Map<String, String> onUpdateColumns = tableInfo.getOnUpdateColumns();
if (onUpdateColumns != null && !onUpdateColumns.isEmpty()) {
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + " = " + value));
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + EQUALS + value));
}
//乐观锁字段
String versionColumn = tableInfo.getVersionColumn();
if (StringUtil.isNotBlank(versionColumn)) {
stringJoiner.add(wrap(versionColumn) + " = " + wrap(versionColumn) + " + 1 ");
stringJoiner.add(wrap(versionColumn) + EQUALS + wrap(versionColumn) + " + 1 ");
}
sql.append(stringJoiner);
@ -685,12 +696,12 @@ public class CommonsDialectImpl implements IDialect {
throw new IllegalArgumentException("Not allowed UPDATE a table without where condition.");
}
sql.append(" WHERE ").append(whereConditionSql);
sql.append(WHERE).append(whereConditionSql);
List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) {
for (String endFragment : endFragments) {
sql.append(" ").append(endFragment);
sql.append(BLANK).append(endFragment);
}
}
@ -701,12 +712,12 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forUpdateNumberAddByQuery(String schema, String tableName, String fieldName, Number value, QueryWrapper queryWrapper) {
StringBuilder sql = new StringBuilder();
sql.append("UPDATE ").append(forHint(CPI.getHint(queryWrapper)));
sql.append(UPDATE).append(forHint(CPI.getHint(queryWrapper)));
if (StringUtil.isNotBlank(schema)) {
sql.append(wrap(getRealSchema(schema))).append(".");
sql.append(wrap(getRealSchema(schema))).append(REFERENCE);
}
sql.append(wrap(getRealTable(tableName))).append(" SET ");
sql.append(wrap(fieldName)).append("=").append(wrap(fieldName)).append(geZero(value) ? " + " : " - ").append(abs(value));
sql.append(wrap(getRealTable(tableName))).append(SET);
sql.append(wrap(fieldName)).append(EQUALS).append(wrap(fieldName)).append(geZero(value) ? PLUS_SIGN : MINUS_SIGN).append(abs(value));
String whereConditionSql = buildWhereConditionSql(queryWrapper);
@ -715,12 +726,12 @@ public class CommonsDialectImpl implements IDialect {
throw new IllegalArgumentException("Not allowed UPDATE a table without where condition.");
}
sql.append(" WHERE ").append(whereConditionSql);
sql.append(WHERE).append(whereConditionSql);
List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) {
for (String endFragment : endFragments) {
sql.append(" ").append(endFragment);
sql.append(BLANK).append(endFragment);
}
}
return sql.toString();
@ -760,26 +771,26 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forSelectOneEntityById(TableInfo tableInfo) {
StringBuilder sql = buildSelectColumnSql(null, null, null);
sql.append(" FROM ").append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(" WHERE ");
sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(WHERE);
String[] pKeys = tableInfo.getPrimaryKeys();
for (int i = 0; i < pKeys.length; i++) {
if (i > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(pKeys[i])).append(" = ?");
sql.append(wrap(pKeys[i])).append(EQUALS_PLACEHOLDER);
}
//逻辑删除的情况下需要添加逻辑删除的条件
String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
if (StringUtil.isNotBlank(logicDeleteColumn)) {
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
sql.append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
}
//多租户
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN ").append(buildQuestion(tenantIdArgs.length, true));
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
return sql.toString();
@ -789,53 +800,53 @@ public class CommonsDialectImpl implements IDialect {
@Override
public String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues) {
StringBuilder sql = buildSelectColumnSql(null, tableInfo.getDefaultQueryColumn(), null);
sql.append(" FROM ").append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(" WHERE ");
sql.append(FROM).append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(WHERE);
String[] primaryKeys = tableInfo.getPrimaryKeys();
String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
Object[] tenantIdArgs = tableInfo.buildTenantIdArgs();
if (StringUtil.isNotBlank(logicDeleteColumn) || ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append("(");
sql.append(LEFT_BRACKET);
}
//多主键的场景
if (primaryKeys.length > 1) {
for (int i = 0; i < primaryValues.length / primaryKeys.length; i++) {
if (i > 0) {
sql.append(" OR ");
sql.append(OR);
}
sql.append("(");
sql.append(LEFT_BRACKET);
for (int j = 0; j < primaryKeys.length; j++) {
if (j > 0) {
sql.append(" AND ");
sql.append(AND);
}
sql.append(wrap(primaryKeys[j])).append(" = ?");
sql.append(wrap(primaryKeys[j])).append(EQUALS_PLACEHOLDER);
}
sql.append(")");
sql.append(RIGHT_BRACKET);
}
}
// 单主键
else {
for (int i = 0; i < primaryValues.length; i++) {
if (i > 0) {
sql.append(" OR ");
sql.append(OR);
}
sql.append(wrap(primaryKeys[0])).append(" = ?");
sql.append(wrap(primaryKeys[0])).append(EQUALS_PLACEHOLDER);
}
}
if (StringUtil.isNotBlank(logicDeleteColumn) || ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(")");
sql.append(RIGHT_BRACKET);
}
if (StringUtil.isNotBlank(logicDeleteColumn)) {
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = ").append(getLogicNormalValue());
sql.append(AND).append(wrap(logicDeleteColumn)).append(EQUALS).append(getLogicNormalValue());
}
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
sql.append(" AND ").append(wrap(tableInfo.getTenantIdColumn())).append(" IN").append(buildQuestion(tenantIdArgs.length, true));
sql.append(AND).append(wrap(tableInfo.getTenantIdColumn())).append(IN).append(buildQuestion(tenantIdArgs.length));
}
return sql.toString();
@ -860,7 +871,7 @@ public class CommonsDialectImpl implements IDialect {
if (whereQueryCondition != null) {
String whereSql = whereQueryCondition.toSql(queryTables, this);
if (StringUtil.isNotBlank(whereSql)) {
sqlBuilder.append(" WHERE ").append(whereSql);
sqlBuilder.append(WHERE).append(whereSql);
} else if (!allowNoCondition) {
throw new IllegalArgumentException("Not allowed DELETE a table without where condition.");
}
@ -871,13 +882,13 @@ public class CommonsDialectImpl implements IDialect {
protected void buildGroupBySql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, List<QueryTable> queryTables) {
List<QueryColumn> groupByColumns = CPI.getGroupByColumns(queryWrapper);
if (groupByColumns != null && !groupByColumns.isEmpty()) {
sqlBuilder.append(" GROUP BY ");
sqlBuilder.append(GROUP_BY);
int index = 0;
for (QueryColumn groupByColumn : groupByColumns) {
String groupBy = CPI.toConditionSql(groupByColumn, queryTables, this);
sqlBuilder.append(groupBy);
if (index != groupByColumns.size() - 1) {
sqlBuilder.append(", ");
sqlBuilder.append(DELIMITER);
}
index++;
}
@ -890,7 +901,7 @@ public class CommonsDialectImpl implements IDialect {
if (havingQueryCondition != null) {
String havingSql = havingQueryCondition.toSql(queryTables, this);
if (StringUtil.isNotBlank(havingSql)) {
sqlBuilder.append(" HAVING ").append(havingSql);
sqlBuilder.append(HAVING).append(havingSql);
}
}
}
@ -899,12 +910,12 @@ public class CommonsDialectImpl implements IDialect {
protected void buildOrderBySql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, List<QueryTable> queryTables) {
List<QueryOrderBy> orderBys = CPI.getOrderBys(queryWrapper);
if (orderBys != null && !orderBys.isEmpty()) {
sqlBuilder.append(" ORDER BY ");
sqlBuilder.append(ORDER_BY);
int index = 0;
for (QueryOrderBy orderBy : orderBys) {
sqlBuilder.append(orderBy.toSql(queryTables, this));
if (index != orderBys.size() - 1) {
sqlBuilder.append(", ");
sqlBuilder.append(DELIMITER);
}
index++;
}
@ -920,15 +931,16 @@ public class CommonsDialectImpl implements IDialect {
}
protected String buildQuestion(int count, boolean withBrackets) {
StringBuilder sb = new StringBuilder();
protected String buildQuestion(int count) {
StringBuilder sb = new StringBuilder(LEFT_BRACKET);
for (int i = 0; i < count; i++) {
sb.append("?");
sb.append(PLACEHOLDER);
if (i != count - 1) {
sb.append(", ");
sb.append(DELIMITER);
}
}
return withBrackets ? "(" + sb + ")" : sb.toString();
sb.append(RIGHT_BRACKET);
return sb.toString();
}
@ -938,7 +950,7 @@ public class CommonsDialectImpl implements IDialect {
|| normalValueOfLogicDelete instanceof Boolean) {
return normalValueOfLogicDelete;
}
return "'" + normalValueOfLogicDelete + "'";
return SINGLE_QUOTE + normalValueOfLogicDelete + SINGLE_QUOTE;
}
@ -948,7 +960,7 @@ public class CommonsDialectImpl implements IDialect {
|| deletedValueOfLogicDelete instanceof Boolean) {
return deletedValueOfLogicDelete;
}
return "'" + deletedValueOfLogicDelete + "'";
return SINGLE_QUOTE + deletedValueOfLogicDelete + SINGLE_QUOTE;
}
}

View File

@ -1,20 +1,21 @@
/**
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
/*
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mybatisflex.core.dialect.impl;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.KeywordWrap;
import com.mybatisflex.core.dialect.LimitOffsetProcessor;
import com.mybatisflex.core.row.Row;
@ -27,6 +28,8 @@ import java.util.Map;
import java.util.Set;
import java.util.StringJoiner;
import static com.mybatisflex.core.constant.SqlConsts.*;
public class OracleDialect extends CommonsDialectImpl {
private static final Set<String> keywords = CollectionUtil.newHashSet(
@ -80,7 +83,7 @@ public class OracleDialect extends CommonsDialectImpl {
* SELECT 1 FROM DUAL;
*/
StringBuilder sql = new StringBuilder();
sql.append("INSERT ALL");
sql.append(INSERT_ALL);
String[] insertColumns = tableInfo.obtainInsertColumns(null, false);
String[] warpedInsertColumns = new String[insertColumns.length];
for (int i = 0; i < insertColumns.length; i++) {
@ -90,23 +93,23 @@ public class OracleDialect extends CommonsDialectImpl {
Map<String, String> onInsertColumns = tableInfo.getOnInsertColumns();
for (int i = 0; i < entities.size(); i++) {
sql.append(" INTO ").append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(" (").append(StringUtil.join(", ", warpedInsertColumns)).append(")");
sql.append(" VALUES ");
sql.append(INTO).append(tableInfo.getWrapSchemaAndTableName(this));
sql.append(BLANK).append(LEFT_BRACKET).append(StringUtil.join(DELIMITER, warpedInsertColumns)).append(RIGHT_BRACKET);
sql.append(VALUES);
StringJoiner stringJoiner = new StringJoiner(", ", "(", ")");
StringJoiner stringJoiner = new StringJoiner(DELIMITER, LEFT_BRACKET, RIGHT_BRACKET);
for (String insertColumn : insertColumns) {
if (onInsertColumns != null && onInsertColumns.containsKey(insertColumn)) {
//直接读取 onInsert 配置的值而不用 "?" 代替
stringJoiner.add(onInsertColumns.get(insertColumn));
} else {
stringJoiner.add("?");
stringJoiner.add(PLACEHOLDER);
}
}
sql.append(stringJoiner);
}
return sql.append(" SELECT 1 FROM DUAL").toString();
return sql.append(INSERT_ALL_END).toString();
}
@ -129,25 +132,25 @@ public class OracleDialect extends CommonsDialectImpl {
for (String column : attrs) {
fields.append(wrap(column));
if (index != attrs.size() - 1) {
fields.append(", ");
fields.append(SqlConsts.DELIMITER);
}
index++;
}
StringBuilder sql = new StringBuilder();
sql.append("INSERT ALL");
sql.append(INSERT_ALL);
String tableNameWrap = StringUtil.isNotBlank(schema)
? wrap(getRealSchema(schema)) + "." + wrap(getRealTable(tableName))
? wrap(getRealSchema(schema)) + REFERENCE + wrap(getRealTable(tableName))
: wrap(getRealTable(tableName));
String questionStrings = buildQuestion(attrs.size(), true);
String questionStrings = buildQuestion(attrs.size());
for (int i = 0; i < rows.size(); i++) {
sql.append(" INTO ").append(tableNameWrap);
sql.append(" (").append(fields).append(")");
sql.append(" VALUES ").append(questionStrings);
sql.append(INTO).append(tableNameWrap);
sql.append(BLANK).append(LEFT_BRACKET).append(fields).append(RIGHT_BRACKET);
sql.append(VALUES).append(questionStrings);
}
return sql.append(" SELECT 1 FROM DUAL").toString();
return sql.append(INSERT_ALL_END).toString();
}
}

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.util.CollectionUtil;
@ -23,6 +24,8 @@ import com.mybatisflex.core.util.StringUtil;
import java.util.ArrayList;
import java.util.List;
import static com.mybatisflex.core.constant.SqlConsts.*;
public class ArithmeticQueryColumn extends QueryColumn {
private List<ArithmeticInfo> arithmeticInfos;
@ -34,49 +37,49 @@ public class ArithmeticQueryColumn extends QueryColumn {
@Override
public QueryColumn add(QueryColumn queryColumn) {
arithmeticInfos.add(new ArithmeticInfo(" + ", queryColumn));
arithmeticInfos.add(new ArithmeticInfo(PLUS_SIGN, queryColumn));
return this;
}
@Override
public QueryColumn add(Number number) {
arithmeticInfos.add(new ArithmeticInfo(" + ", number));
arithmeticInfos.add(new ArithmeticInfo(PLUS_SIGN, number));
return this;
}
@Override
public QueryColumn subtract(QueryColumn queryColumn) {
arithmeticInfos.add(new ArithmeticInfo(" - ", queryColumn));
arithmeticInfos.add(new ArithmeticInfo(MINUS_SIGN, queryColumn));
return this;
}
@Override
public QueryColumn subtract(Number number) {
arithmeticInfos.add(new ArithmeticInfo(" - ", number));
arithmeticInfos.add(new ArithmeticInfo(MINUS_SIGN, number));
return this;
}
@Override
public QueryColumn multiply(QueryColumn queryColumn) {
arithmeticInfos.add(new ArithmeticInfo(" * ", queryColumn));
arithmeticInfos.add(new ArithmeticInfo(MULTIPLICATION_SIGN, queryColumn));
return this;
}
@Override
public QueryColumn multiply(Number number) {
arithmeticInfos.add(new ArithmeticInfo(" * ", number));
arithmeticInfos.add(new ArithmeticInfo(MULTIPLICATION_SIGN, number));
return this;
}
@Override
public QueryColumn divide(QueryColumn queryColumn) {
arithmeticInfos.add(new ArithmeticInfo(" / ", queryColumn));
arithmeticInfos.add(new ArithmeticInfo(DIVISION_SIGN, queryColumn));
return this;
}
@Override
public QueryColumn divide(Number number) {
arithmeticInfos.add(new ArithmeticInfo(" / ", number));
arithmeticInfos.add(new ArithmeticInfo(DIVISION_SIGN, number));
return this;
}
@ -93,7 +96,7 @@ public class ArithmeticQueryColumn extends QueryColumn {
sql.append(arithmeticInfos.get(i).toSql(queryTables, dialect, i));
}
if (StringUtil.isNotBlank(alias)) {
return "(" + sql + ") AS " + dialect.wrap(alias);
return WrapperUtil.withAlias(sql.toString(), dialect.wrap(alias));
}
return sql.toString();
}
@ -113,7 +116,7 @@ public class ArithmeticQueryColumn extends QueryColumn {
for (int i = 0; i < arithmeticInfos.size(); i++) {
sql.append(arithmeticInfos.get(i).toSql(queryTables, dialect, i));
}
return "(" + sql + ")";
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET;
}

View File

@ -16,10 +16,14 @@
package com.mybatisflex.core.query;
import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.DialectFactory;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.util.*;
import com.mybatisflex.core.util.ArrayUtil;
import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.ObjectUtil;
import com.mybatisflex.core.util.StringUtil;
import java.util.ArrayList;
import java.util.List;
@ -39,17 +43,17 @@ public class CaseQueryColumn extends QueryColumn implements HasParamsColumn {
@Override
String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
StringBuilder sql = new StringBuilder("CASE");
StringBuilder sql = new StringBuilder(SqlConsts.CASE);
for (When when : whens) {
sql.append(" WHEN ").append(when.whenCondition.toSql(queryTables, dialect));
sql.append(" THEN ").append(buildValue(when.thenValue));
sql.append(SqlConsts.WHEN).append(when.whenCondition.toSql(queryTables, dialect));
sql.append(SqlConsts.THEN).append(buildValue(when.thenValue));
}
if (elseValue != null) {
sql.append(" ELSE ").append(buildValue(elseValue));
sql.append(SqlConsts.ELSE).append(buildValue(elseValue));
}
sql.append(" END");
sql.append(SqlConsts.END);
if (StringUtil.isNotBlank(alias)) {
return "(" + sql + ") AS " + dialect.wrap(alias);
return WrapperUtil.withAlias(sql.toString(), dialect.wrap(alias));
}
return sql.toString();
}
@ -65,16 +69,16 @@ public class CaseQueryColumn extends QueryColumn implements HasParamsColumn {
@Override
String toConditionSql(List<QueryTable> queryTables, IDialect dialect) {
StringBuilder sql = new StringBuilder("CASE");
StringBuilder sql = new StringBuilder(SqlConsts.CASE);
for (When when : whens) {
sql.append(" WHEN ").append(when.whenCondition.toSql(queryTables, dialect));
sql.append(" THEN ").append(buildValue(when.thenValue));
sql.append(SqlConsts.WHEN).append(when.whenCondition.toSql(queryTables, dialect));
sql.append(SqlConsts.THEN).append(buildValue(when.thenValue));
}
if (elseValue != null) {
sql.append(" ELSE ").append(buildValue(elseValue));
sql.append(SqlConsts.ELSE).append(buildValue(elseValue));
}
sql.append(" END");
return "(" + sql + ")";
sql.append(SqlConsts.END);
return WrapperUtil.withBracket(sql.toString());
}
@Override

View File

@ -16,10 +16,14 @@
package com.mybatisflex.core.query;
import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.DialectFactory;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.util.*;
import com.mybatisflex.core.util.ArrayUtil;
import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.ObjectUtil;
import com.mybatisflex.core.util.StringUtil;
import java.util.ArrayList;
import java.util.List;
@ -32,17 +36,17 @@ public class CaseSearchQueryColumn extends QueryColumn implements HasParamsColum
@Override
String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
StringBuilder sql = new StringBuilder("CASE ");
sql.append(queryColumn.toSelectSql(queryTables, dialect));
StringBuilder sql = new StringBuilder(SqlConsts.CASE);
sql.append(SqlConsts.BLANK).append(queryColumn.toSelectSql(queryTables, dialect));
for (When when : whens) {
sql.append(" WHEN ").append(buildValue(when.searchValue)).append(" THEN ").append(buildValue(when.thenValue));
sql.append(SqlConsts.WHEN).append(buildValue(when.searchValue)).append(" THEN ").append(buildValue(when.thenValue));
}
if (elseValue != null) {
sql.append(" ELSE ").append(buildValue(elseValue));
sql.append(SqlConsts.ELSE).append(buildValue(elseValue));
}
sql.append(" END");
sql.append(SqlConsts.END);
if (StringUtil.isNotBlank(alias)) {
return "(" + sql + ") AS " + dialect.wrap(alias);
return WrapperUtil.withAlias(sql.toString(), dialect.wrap(alias));
}
return sql.toString();
}
@ -59,16 +63,17 @@ public class CaseSearchQueryColumn extends QueryColumn implements HasParamsColum
@Override
String toConditionSql(List<QueryTable> queryTables, IDialect dialect) {
StringBuilder sql = new StringBuilder("CASE ");
sql.append(queryColumn.toSelectSql(queryTables, dialect));
StringBuilder sql = new StringBuilder(SqlConsts.CASE);
sql.append(SqlConsts.BLANK).append(queryColumn.toSelectSql(queryTables, dialect));
for (When when : whens) {
sql.append(" WHEN ").append(buildValue(when.searchValue)).append(" THEN ").append(buildValue(when.thenValue));
sql.append(SqlConsts.WHEN).append(buildValue(when.searchValue));
sql.append(SqlConsts.THEN).append(buildValue(when.thenValue));
}
if (elseValue != null) {
sql.append(" ELSE ").append(buildValue(elseValue));
sql.append(SqlConsts.ELSE).append(buildValue(elseValue));
}
sql.append(" END");
return "(" + sql + ")";
sql.append(SqlConsts.END);
return WrapperUtil.withBracket(sql.toString());
}

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.StringUtil;
@ -32,9 +33,9 @@ public class DistinctQueryColumn extends QueryColumn {
@Override
public String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
if (CollectionUtil.isEmpty(queryTables)) {
return "";
return SqlConsts.EMPTY;
}
return "DISTINCT " + StringUtil.join(", ", queryColumns, queryColumn ->
return SqlConsts.DISTINCT + StringUtil.join(SqlConsts.DELIMITER, queryColumns, queryColumn ->
queryColumn.toSelectSql(queryTables, dialect));
}

View File

@ -16,6 +16,7 @@
package com.mybatisflex.core.query;
import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.util.ObjectUtil;
import com.mybatisflex.core.util.SqlUtil;
@ -71,7 +72,13 @@ public class FunctionQueryColumn extends QueryColumn implements HasParamsColumn
@Override
public String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
String sql = column.toSelectSql(queryTables, dialect);
return StringUtil.isBlank(sql) ? "" : fnName + "(" + sql + ")" + WrapperUtil.buildAsAlias(alias, dialect);
if (StringUtil.isBlank(sql)) {
return SqlConsts.EMPTY;
}
if (StringUtil.isBlank(alias)) {
return fnName + WrapperUtil.withBracket(sql);
}
return fnName + WrapperUtil.withAlias(sql, dialect.wrap(alias));
}
@Override

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.util.ObjectUtil;
@ -31,13 +32,6 @@ public class Join implements CloneSupport<Join> {
private static final long serialVersionUID = 1L;
public static final String TYPE_JOIN = " JOIN ";
public static final String TYPE_LEFT = " LEFT JOIN ";
public static final String TYPE_RIGHT = " RIGHT JOIN ";
public static final String TYPE_INNER = " INNER JOIN ";
public static final String TYPE_FULL = " FULL JOIN ";
public static final String TYPE_CROSS = " CROSS JOIN ";
protected final String type;
protected QueryTable queryTable;
@ -90,7 +84,7 @@ public class Join implements CloneSupport<Join> {
//left join xxx as xxx2 on xxx2.id = xxx3.other
List<QueryTable> newQueryTables = new ArrayList<>(queryTables);
newQueryTables.add(queryTable);
sql.append(" ON ").append(on.toSql(newQueryTables, dialect));
sql.append(SqlConsts.ON).append(on.toSql(newQueryTables, dialect));
return sql.toString();
}

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.util.ObjectUtil;
import com.mybatisflex.core.util.StringUtil;
@ -47,7 +48,10 @@ public class OperatorQueryCondition extends QueryCondition {
if (prevEffectiveCondition != null) {
sql.append(prevEffectiveCondition.connector);
}
sql.append(operator).append("(").append(childSql).append(")");
sql.append(operator)
.append(SqlConsts.LEFT_BRACKET)
.append(childSql)
.append(SqlConsts.RIGHT_BRACKET);
}
}

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.util.ObjectUtil;
import com.mybatisflex.core.util.StringUtil;
@ -49,7 +50,10 @@ public class OperatorSelectCondition extends QueryCondition {
if (prevEffectiveCondition != null) {
sql.append(prevEffectiveCondition.connector);
}
sql.append(operator).append("(").append(childSql).append(")");
sql.append(operator)
.append(SqlConsts.LEFT_BRACKET)
.append(childSql)
.append(SqlConsts.RIGHT_BRACKET);
}
}

View File

@ -16,6 +16,7 @@
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.table.TableDef;
@ -111,7 +112,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_EQUALS, value);
return QueryCondition.create(this, SqlConsts.EQUALS, value);
}
@ -119,7 +120,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_EQUALS, value).when(fn);
return QueryCondition.create(this, SqlConsts.EQUALS, value).when(fn);
}
@ -132,14 +133,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_EQUALS, value);
return QueryCondition.create(this, SqlConsts.NOT_EQUALS, value);
}
public <T> QueryCondition ne(Object value, Predicate<T> fn) {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_EQUALS, value).when(fn);
return QueryCondition.create(this, SqlConsts.NOT_EQUALS, value).when(fn);
}
@ -152,14 +153,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, "%" + value + "%");
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value + "%");
}
public <T> QueryCondition like(Object value, Predicate<T> fn) {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, "%" + value + "%").when(fn);
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value + "%").when(fn);
}
@ -167,14 +168,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, value + "%");
return QueryCondition.create(this, SqlConsts.LIKE, value + "%");
}
public <T> QueryCondition likeLeft(Object value, Predicate<T> fn) {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, value + "%").when(fn);
return QueryCondition.create(this, SqlConsts.LIKE, value + "%").when(fn);
}
@ -182,14 +183,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, "%" + value);
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value);
}
public <T> QueryCondition likeRight(Object value, Predicate<T> fn) {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LIKE, "%" + value).when(fn);
return QueryCondition.create(this, SqlConsts.LIKE, "%" + value).when(fn);
}
/**
@ -201,14 +202,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_GT, value);
return QueryCondition.create(this, SqlConsts.GT, value);
}
public <T> QueryCondition gt(Object value, Predicate<T> fn) {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_GT, value).when(fn);
return QueryCondition.create(this, SqlConsts.GT, value).when(fn);
}
/**
@ -220,14 +221,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_GE, value);
return QueryCondition.create(this, SqlConsts.GE, value);
}
public <T> QueryCondition ge(Object value, Predicate<T> fn) {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_GE, value).when(fn);
return QueryCondition.create(this, SqlConsts.GE, value).when(fn);
}
/**
@ -239,14 +240,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LT, value);
return QueryCondition.create(this, SqlConsts.LT, value);
}
public <T> QueryCondition lt(Object value, Predicate<T> fn) {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LT, value).when(fn);
return QueryCondition.create(this, SqlConsts.LT, value).when(fn);
}
/**
@ -258,14 +259,14 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LE, value);
return QueryCondition.create(this, SqlConsts.LE, value);
}
public <T> QueryCondition le(Object value, Predicate<T> fn) {
if (value == null) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_LE, value).when(fn);
return QueryCondition.create(this, SqlConsts.LE, value).when(fn);
}
@ -275,11 +276,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
* @return
*/
public QueryCondition isNull() {
return QueryCondition.create(this, QueryCondition.LOGIC_IS_NULL, null);
return QueryCondition.create(this, SqlConsts.IS_NULL, null);
}
public <T> QueryCondition isNull(Predicate<T> fn) {
return QueryCondition.create(this, QueryCondition.LOGIC_IS_NULL, null).when(fn);
return QueryCondition.create(this, SqlConsts.IS_NULL, null).when(fn);
}
@ -289,11 +290,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
* @return
*/
public QueryCondition isNotNull() {
return QueryCondition.create(this, QueryCondition.LOGIC_IS_NOT_NULL, null);
return QueryCondition.create(this, SqlConsts.IS_NOT_NULL, null);
}
public <T> QueryCondition isNotNull(Predicate<T> fn) {
return QueryCondition.create(this, QueryCondition.LOGIC_IS_NOT_NULL, null).when(fn);
return QueryCondition.create(this, SqlConsts.IS_NOT_NULL, null).when(fn);
}
@ -308,7 +309,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null)) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_IN, arrays);
return QueryCondition.create(this, SqlConsts.IN, arrays);
}
public <T> QueryCondition in(Object[] arrays, Predicate<T> fn) {
@ -316,7 +317,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null)) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_IN, arrays).when(fn);
return QueryCondition.create(this, SqlConsts.IN, arrays).when(fn);
}
/**
@ -326,11 +327,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
* @return
*/
public QueryCondition in(QueryWrapper queryWrapper) {
return QueryCondition.create(this, QueryCondition.LOGIC_IN, queryWrapper);
return QueryCondition.create(this, SqlConsts.IN, queryWrapper);
}
public <T> QueryCondition in(QueryWrapper queryWrapper, Predicate<T> fn) {
return QueryCondition.create(this, QueryCondition.LOGIC_IN, queryWrapper).when(fn);
return QueryCondition.create(this, SqlConsts.IN, queryWrapper).when(fn);
}
@ -365,7 +366,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null)) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_IN, arrays);
return QueryCondition.create(this, SqlConsts.NOT_IN, arrays);
}
public <T> QueryCondition notIn(Object[] arrays, Predicate<T> fn) {
@ -373,7 +374,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
if (arrays == null || arrays.length == 0 || (arrays.length == 1 && arrays[0] == null)) {
return QueryCondition.createEmpty();
}
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_IN, arrays).when(fn);
return QueryCondition.create(this, SqlConsts.NOT_IN, arrays).when(fn);
}
@ -403,11 +404,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
* @param queryWrapper
*/
public QueryCondition notIn(QueryWrapper queryWrapper) {
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_IN, queryWrapper);
return QueryCondition.create(this, SqlConsts.NOT_IN, queryWrapper);
}
public <T> QueryCondition notIn(QueryWrapper queryWrapper, Predicate<T> fn) {
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_IN, queryWrapper).when(fn);
return QueryCondition.create(this, SqlConsts.NOT_IN, queryWrapper).when(fn);
}
@ -418,11 +419,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
* @param end
*/
public QueryCondition between(Object start, Object end) {
return QueryCondition.create(this, QueryCondition.LOGIC_BETWEEN, new Object[]{start, end});
return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end});
}
public <T> QueryCondition between(Object start, Object end, Predicate<T> fn) {
return QueryCondition.create(this, QueryCondition.LOGIC_BETWEEN, new Object[]{start, end}).when(fn);
return QueryCondition.create(this, SqlConsts.BETWEEN, new Object[]{start, end}).when(fn);
}
@ -433,22 +434,22 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
* @param end
*/
public QueryCondition notBetween(Object start, Object end) {
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_BETWEEN, new Object[]{start, end});
return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end});
}
public <T> QueryCondition notBetween(Object start, Object end, Predicate<T> fn) {
return QueryCondition.create(this, QueryCondition.LOGIC_NOT_BETWEEN, new Object[]{start, end}).when(fn);
return QueryCondition.create(this, SqlConsts.NOT_BETWEEN, new Object[]{start, end}).when(fn);
}
////order by ////
public QueryOrderBy asc() {
return new QueryOrderBy(this);
return new QueryOrderBy(this, SqlConsts.ASC);
}
public QueryOrderBy desc() {
return new QueryOrderBy(this, "DESC");
return new QueryOrderBy(this, SqlConsts.DESC);
}
@ -492,11 +493,11 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
return dialect.wrap(name);
} else {
if (StringUtil.isNotBlank(selectTable.alias)) {
return dialect.wrap(selectTable.alias) + "." + dialect.wrap(name);
return dialect.wrap(selectTable.alias) + SqlConsts.REFERENCE + dialect.wrap(name);
} else if (StringUtil.isNotBlank(selectTable.getSchema()) && StringUtil.isNotBlank(selectTable.getName())) {
return dialect.wrap(dialect.getRealSchema(selectTable.schema)) + "." + dialect.wrap(dialect.getRealTable(selectTable.getName())) + "." + dialect.wrap(name);
return dialect.wrap(dialect.getRealSchema(selectTable.schema)) + SqlConsts.REFERENCE + dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name);
} else if (StringUtil.isNotBlank(selectTable.getName())) {
return dialect.wrap(dialect.getRealTable(selectTable.getName())) + "." + dialect.wrap(name);
return dialect.wrap(dialect.getRealTable(selectTable.getName())) + SqlConsts.REFERENCE + dialect.wrap(name);
} else {
return dialect.wrap(name);
}
@ -505,7 +506,7 @@ public class QueryColumn implements CloneSupport<QueryColumn> {
String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
return toConditionSql(queryTables, dialect) + WrapperUtil.buildAsAlias(alias, dialect);
return toConditionSql(queryTables, dialect) + WrapperUtil.withAliasIf(alias, dialect);
}

View File

@ -16,6 +16,7 @@
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.util.ClassUtil;
@ -28,22 +29,6 @@ import java.util.function.Supplier;
public class QueryCondition implements CloneSupport<QueryCondition> {
public static final String LOGIC_LIKE = "LIKE";
public static final String LOGIC_GT = ">";
public static final String LOGIC_GE = ">=";
public static final String LOGIC_LT = "<";
public static final String LOGIC_LE = "<=";
public static final String LOGIC_EQUALS = "=";
public static final String LOGIC_NOT_EQUALS = "!=";
public static final String LOGIC_IS_NULL = "IS NULL";
public static final String LOGIC_IS_NOT_NULL = "IS NOT NULL";
public static final String LOGIC_IN = "IN";
public static final String LOGIC_NOT_IN = "NOT IN";
public static final String LOGIC_BETWEEN = "BETWEEN";
public static final String LOGIC_NOT_BETWEEN = "NOT BETWEEN";
protected QueryColumn column;
protected String logic;
@ -73,7 +58,7 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
}
public static QueryCondition create(QueryColumn queryColumn, Object value) {
return create(queryColumn, LOGIC_EQUALS, value);
return create(queryColumn, SqlConsts.EQUALS, value);
}
public static QueryCondition create(QueryColumn queryColumn, String logic, Object value) {
@ -124,12 +109,12 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
public <T> QueryCondition when(Predicate<T> fn) {
Object val = this.value;
if (LOGIC_LIKE.equals(logic) && val instanceof String) {
if (SqlConsts.LIKE.equals(logic) && val instanceof String) {
String valStr = (String) val;
if (valStr.startsWith("%")) {
if (valStr.startsWith(SqlConsts.PERCENT_SIGN)) {
valStr = valStr.substring(1);
}
if (valStr.endsWith("%")) {
if (valStr.endsWith(SqlConsts.PERCENT_SIGN)) {
valStr = valStr.substring(0, valStr.length() - 1);
}
val = valStr;
@ -188,7 +173,7 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
//
sql.append(getColumn().toConditionSql(queryTables, dialect));
//逻辑符号
sql.append(" ").append(logic).append(" ");
sql.append(logic);
//或者问号
if (value instanceof QueryColumn) {
@ -196,7 +181,9 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
}
//子查询
else if (value instanceof QueryWrapper) {
sql.append("(").append(dialect.buildSelectSql((QueryWrapper) value)).append(")");
sql.append(SqlConsts.LEFT_BRACKET)
.append(dialect.buildSelectSql((QueryWrapper) value))
.append(SqlConsts.RIGHT_BRACKET);
}
//原生sql
else if (value instanceof RawFragment) {
@ -225,8 +212,9 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
protected void appendQuestionMark(StringBuilder sqlBuilder) {
if (LOGIC_IS_NULL.equals(logic)
|| LOGIC_IS_NOT_NULL.equals(logic)
//noinspection StatementWithEmptyBody
if (SqlConsts.IS_NULL.equals(logic)
|| SqlConsts.IS_NOT_NULL.equals(logic)
|| value instanceof QueryColumn
|| value instanceof QueryWrapper
|| value instanceof RawFragment) {
@ -234,22 +222,22 @@ public class QueryCondition implements CloneSupport<QueryCondition> {
}
//between, not between
else if (LOGIC_BETWEEN.equals(logic) || LOGIC_NOT_BETWEEN.equals(logic)) {
sqlBuilder.append(" ? AND ? ");
else if (SqlConsts.BETWEEN.equals(logic) || SqlConsts.NOT_BETWEEN.equals(logic)) {
sqlBuilder.append(SqlConsts.AND_PLACEHOLDER);
}
//in, not in
else if (LOGIC_IN.equals(logic) || LOGIC_NOT_IN.equals(logic)) {
else if (SqlConsts.IN.equals(logic) || SqlConsts.NOT_IN.equals(logic)) {
int paramsCount = calculateValueArrayCount();
sqlBuilder.append('(');
sqlBuilder.append(SqlConsts.LEFT_BRACKET);
for (int i = 0; i < paramsCount; i++) {
sqlBuilder.append('?');
sqlBuilder.append(SqlConsts.PLACEHOLDER);
if (i != paramsCount - 1) {
sqlBuilder.append(',');
sqlBuilder.append(SqlConsts.DELIMITER);
}
}
sqlBuilder.append(')');
sqlBuilder.append(SqlConsts.RIGHT_BRACKET);
} else {
sqlBuilder.append(" ? ");
sqlBuilder.append(SqlConsts.PLACEHOLDER);
}
}

View File

@ -1,20 +1,21 @@
/**
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
/*
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.util.LambdaGetter;
import com.mybatisflex.core.util.LambdaUtil;
@ -22,118 +23,118 @@ public class QueryMethods {
/////count
public static FunctionQueryColumn count() {
return new FunctionQueryColumn("COUNT", new StringQueryColumn("*"));
return new FunctionQueryColumn(SqlConsts.COUNT, new StringQueryColumn("*"));
}
public static FunctionQueryColumn count(String column) {
return new FunctionQueryColumn("COUNT", column);
return new FunctionQueryColumn(SqlConsts.COUNT, column);
}
public static FunctionQueryColumn count(QueryColumn column) {
return new FunctionQueryColumn("COUNT", column);
return new FunctionQueryColumn(SqlConsts.COUNT, column);
}
public static <T> FunctionQueryColumn count(LambdaGetter<T> fn) {
return new FunctionQueryColumn("COUNT", LambdaUtil.getQueryColumn(fn));
return new FunctionQueryColumn(SqlConsts.COUNT, LambdaUtil.getQueryColumn(fn));
}
/////max
public static FunctionQueryColumn max(String column) {
return new FunctionQueryColumn("MAX", column);
return new FunctionQueryColumn(SqlConsts.MAX, column);
}
public static FunctionQueryColumn max(QueryColumn column) {
return new FunctionQueryColumn("MAX", column);
return new FunctionQueryColumn(SqlConsts.MAX, column);
}
public static <T> FunctionQueryColumn max(LambdaGetter<T> fn) {
return new FunctionQueryColumn("MAX", LambdaUtil.getQueryColumn(fn));
return new FunctionQueryColumn(SqlConsts.MAX, LambdaUtil.getQueryColumn(fn));
}
/////min
public static FunctionQueryColumn min(String column) {
return new FunctionQueryColumn("MIN", column);
return new FunctionQueryColumn(SqlConsts.MIN, column);
}
public static FunctionQueryColumn min(QueryColumn column) {
return new FunctionQueryColumn("MIN", column);
return new FunctionQueryColumn(SqlConsts.MIN, column);
}
public static <T> FunctionQueryColumn min(LambdaGetter<T> fn) {
return new FunctionQueryColumn("MIN", LambdaUtil.getQueryColumn(fn));
return new FunctionQueryColumn(SqlConsts.MIN, LambdaUtil.getQueryColumn(fn));
}
/////avg
public static FunctionQueryColumn avg(String column) {
return new FunctionQueryColumn("AVG", column);
return new FunctionQueryColumn(SqlConsts.AVG, column);
}
public static FunctionQueryColumn avg(QueryColumn column) {
return new FunctionQueryColumn("AVG", column);
return new FunctionQueryColumn(SqlConsts.AVG, column);
}
public static <T> FunctionQueryColumn avg(LambdaGetter<T> fn) {
return new FunctionQueryColumn("AVG", LambdaUtil.getQueryColumn(fn));
return new FunctionQueryColumn(SqlConsts.AVG, LambdaUtil.getQueryColumn(fn));
}
/////sum
public static FunctionQueryColumn sum(String column) {
return new FunctionQueryColumn("SUM", column);
return new FunctionQueryColumn(SqlConsts.SUM, column);
}
public static FunctionQueryColumn sum(QueryColumn column) {
return new FunctionQueryColumn("SUM", column);
return new FunctionQueryColumn(SqlConsts.SUM, column);
}
public static <T> FunctionQueryColumn sum(LambdaGetter<T> fn) {
return new FunctionQueryColumn("SUM", LambdaUtil.getQueryColumn(fn));
return new FunctionQueryColumn(SqlConsts.SUM, LambdaUtil.getQueryColumn(fn));
}
/////year
public static FunctionQueryColumn year(String column) {
return new FunctionQueryColumn("YEAR", column);
return new FunctionQueryColumn(SqlConsts.YEAR, column);
}
public static FunctionQueryColumn year(QueryColumn column) {
return new FunctionQueryColumn("YEAR", column);
return new FunctionQueryColumn(SqlConsts.YEAR, column);
}
public static <T> FunctionQueryColumn year(LambdaGetter<T> fn) {
return new FunctionQueryColumn("YEAR", LambdaUtil.getQueryColumn(fn));
return new FunctionQueryColumn(SqlConsts.YEAR, LambdaUtil.getQueryColumn(fn));
}
/////month
public static FunctionQueryColumn month(String column) {
return new FunctionQueryColumn("MONTH", column);
return new FunctionQueryColumn(SqlConsts.MONTH, column);
}
public static FunctionQueryColumn month(QueryColumn column) {
return new FunctionQueryColumn("MONTH", column);
return new FunctionQueryColumn(SqlConsts.MONTH, column);
}
public static <T> FunctionQueryColumn month(LambdaGetter<T> fn) {
return new FunctionQueryColumn("MONTH", LambdaUtil.getQueryColumn(fn));
return new FunctionQueryColumn(SqlConsts.MONTH, LambdaUtil.getQueryColumn(fn));
}
/////month
public static FunctionQueryColumn day(String column) {
return new FunctionQueryColumn("DAY", column);
return new FunctionQueryColumn(SqlConsts.DAY, column);
}
public static FunctionQueryColumn day(QueryColumn column) {
return new FunctionQueryColumn("DAY", column);
return new FunctionQueryColumn(SqlConsts.DAY, column);
}
public static <T> FunctionQueryColumn day(LambdaGetter<T> fn) {
return new FunctionQueryColumn("DAY", LambdaUtil.getQueryColumn(fn));
return new FunctionQueryColumn(SqlConsts.DAY, LambdaUtil.getQueryColumn(fn));
}
@ -155,7 +156,7 @@ public class QueryMethods {
//CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
public static StringFunctionQueryColumn convert(String... params) {
return new StringFunctionQueryColumn("CONVERT", params);
return new StringFunctionQueryColumn(SqlConsts.CONVERT, params);
}
public static StringQueryColumn column(String column) {
@ -179,15 +180,15 @@ public class QueryMethods {
}
public static QueryCondition exists(QueryWrapper queryWrapper) {
return new OperatorSelectCondition(" EXISTS ", queryWrapper);
return new OperatorSelectCondition(SqlConsts.EXISTS, queryWrapper);
}
public static QueryCondition notExists(QueryWrapper queryWrapper) {
return new OperatorSelectCondition(" NOT EXISTS ", queryWrapper);
return new OperatorSelectCondition(SqlConsts.NOT_EXISTS, queryWrapper);
}
public static QueryCondition not(QueryCondition childCondition) {
return new OperatorQueryCondition(" NOT ", childCondition);
return new OperatorQueryCondition(SqlConsts.NOT, childCondition);
}
public static QueryCondition noCondition() {

View File

@ -16,6 +16,7 @@
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.util.ObjectUtil;
@ -29,7 +30,7 @@ public class QueryOrderBy implements CloneSupport<QueryOrderBy> {
private QueryColumn queryColumn;
private String orderType = "ASC"; //asc desc
private String orderType = SqlConsts.ASC; //asc desc
private boolean nullsFirst = false;
private boolean nullsLast = false;
@ -63,11 +64,11 @@ public class QueryOrderBy implements CloneSupport<QueryOrderBy> {
public String toSql(List<QueryTable> queryTables, IDialect dialect) {
String sql = queryColumn.toConditionSql(queryTables, dialect) + " " + orderType;
String sql = queryColumn.toConditionSql(queryTables, dialect) + orderType;
if (nullsFirst) {
sql = sql + " NULLS FIRST";
sql = sql + SqlConsts.NULLS_FIRST;
} else if (nullsLast) {
sql = sql + " NULLS LAST";
sql = sql + SqlConsts.NULLS_LAST;
}
return sql;
}

View File

@ -98,9 +98,9 @@ public class QueryTable implements CloneSupport<QueryTable> {
public String toSql(IDialect dialect) {
String sql;
if (StringUtil.isNotBlank(schema)) {
sql = dialect.wrap(dialect.getRealSchema(schema)) + "." + dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.buildAsAlias(alias, dialect);
sql = dialect.wrap(dialect.getRealSchema(schema)) + "." + dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.withAliasIf(alias, dialect);
} else {
sql = dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.buildAsAlias(alias, dialect);
sql = dialect.wrap(dialect.getRealTable(name)) + WrapperUtil.withAliasIf(alias, dialect);
}
return sql;
}

View File

@ -16,6 +16,7 @@
package com.mybatisflex.core.query;
import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.DialectFactory;
import com.mybatisflex.core.table.TableDef;
import com.mybatisflex.core.table.TableInfo;
@ -222,86 +223,86 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
}
public Joiner<QueryWrapper> leftJoin(String table) {
return joining(Join.TYPE_LEFT, new QueryTable(table), true);
return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> leftJoin(String table, boolean when) {
return joining(Join.TYPE_LEFT, new QueryTable(table), when);
return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> leftJoin(Class<?> entityClass) {
return joining(Join.TYPE_LEFT, entityClass, true);
return joining(SqlConsts.LEFT_JOIN, entityClass, true);
}
public Joiner<QueryWrapper> leftJoin(Class<?> entityClass, boolean when) {
return joining(Join.TYPE_LEFT, entityClass, when);
return joining(SqlConsts.LEFT_JOIN, entityClass, when);
}
public Joiner<QueryWrapper> leftJoin(TableDef table) {
return joining(Join.TYPE_LEFT, new QueryTable(table), true);
return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> leftJoin(TableDef table, boolean when) {
return joining(Join.TYPE_LEFT, new QueryTable(table), when);
return joining(SqlConsts.LEFT_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> leftJoin(QueryWrapper table) {
return joining(Join.TYPE_LEFT, table, true);
return joining(SqlConsts.LEFT_JOIN, table, true);
}
public Joiner<QueryWrapper> leftJoin(QueryWrapper table, boolean when) {
return joining(Join.TYPE_LEFT, table, when);
return joining(SqlConsts.LEFT_JOIN, table, when);
}
public Joiner<QueryWrapper> rightJoin(String table) {
return joining(Join.TYPE_RIGHT, new QueryTable(table), true);
return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> rightJoin(String table, boolean when) {
return joining(Join.TYPE_RIGHT, new QueryTable(table), when);
return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> rightJoin(Class<?> entityClass) {
return joining(Join.TYPE_RIGHT, entityClass, true);
return joining(SqlConsts.RIGHT_JOIN, entityClass, true);
}
public Joiner<QueryWrapper> rightJoin(Class<?> entityClass, boolean when) {
return joining(Join.TYPE_RIGHT, entityClass, when);
return joining(SqlConsts.RIGHT_JOIN, entityClass, when);
}
public Joiner<QueryWrapper> rightJoin(TableDef table) {
return joining(Join.TYPE_RIGHT, new QueryTable(table), true);
return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> rightJoin(TableDef table, boolean when) {
return joining(Join.TYPE_RIGHT, new QueryTable(table), when);
return joining(SqlConsts.RIGHT_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> rightJoin(QueryWrapper table) {
return joining(Join.TYPE_RIGHT, table, true);
return joining(SqlConsts.RIGHT_JOIN, table, true);
}
public Joiner<QueryWrapper> rightJoin(QueryWrapper table, boolean when) {
return joining(Join.TYPE_RIGHT, table, when);
return joining(SqlConsts.RIGHT_JOIN, table, when);
}
public Joiner<QueryWrapper> innerJoin(String table) {
return joining(Join.TYPE_INNER, new QueryTable(table), true);
return joining(SqlConsts.INNER_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> innerJoin(String table, boolean when) {
return joining(Join.TYPE_INNER, new QueryTable(table), when);
return joining(SqlConsts.INNER_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> innerJoin(Class<?> entityClass) {
return joining(Join.TYPE_INNER, entityClass, true);
return joining(SqlConsts.INNER_JOIN, entityClass, true);
}
public Joiner<QueryWrapper> innerJoin(Class<?> entityClass, boolean when) {
return joining(Join.TYPE_INNER, entityClass, when);
return joining(SqlConsts.INNER_JOIN, entityClass, when);
}
public Joiner<QueryWrapper> innerJoin(TableDef table) {
@ -309,114 +310,114 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
}
public Joiner<QueryWrapper> innerJoin(TableDef table, boolean when) {
return joining(Join.TYPE_INNER, new QueryTable(table), when);
return joining(SqlConsts.INNER_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> innerJoin(QueryWrapper table) {
return joining(Join.TYPE_INNER, table, true);
return joining(SqlConsts.INNER_JOIN, table, true);
}
public Joiner<QueryWrapper> innerJoin(QueryWrapper table, boolean when) {
return joining(Join.TYPE_INNER, table, when);
return joining(SqlConsts.INNER_JOIN, table, when);
}
public Joiner<QueryWrapper> fullJoin(String table) {
return joining(Join.TYPE_FULL, new QueryTable(table), true);
return joining(SqlConsts.FULL_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> fullJoin(String table, boolean when) {
return joining(Join.TYPE_FULL, new QueryTable(table), when);
return joining(SqlConsts.FULL_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> fullJoin(Class<?> entityClass) {
return joining(Join.TYPE_FULL, entityClass, true);
return joining(SqlConsts.FULL_JOIN, entityClass, true);
}
public Joiner<QueryWrapper> fullJoin(Class<?> entityClass, boolean when) {
return joining(Join.TYPE_FULL, entityClass, when);
return joining(SqlConsts.FULL_JOIN, entityClass, when);
}
public Joiner<QueryWrapper> fullJoin(TableDef table) {
return joining(Join.TYPE_FULL, new QueryTable(table), true);
return joining(SqlConsts.FULL_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> fullJoin(TableDef table, boolean when) {
return joining(Join.TYPE_FULL, new QueryTable(table), when);
return joining(SqlConsts.FULL_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> fullJoin(QueryWrapper table) {
return joining(Join.TYPE_FULL, table, true);
return joining(SqlConsts.FULL_JOIN, table, true);
}
public Joiner<QueryWrapper> fullJoin(QueryWrapper table, boolean when) {
return joining(Join.TYPE_FULL, table, when);
return joining(SqlConsts.FULL_JOIN, table, when);
}
public Joiner<QueryWrapper> crossJoin(String table) {
return joining(Join.TYPE_CROSS, new QueryTable(table), true);
return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> crossJoin(String table, boolean when) {
return joining(Join.TYPE_CROSS, new QueryTable(table), when);
return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> crossJoin(Class<?> entityClass) {
return joining(Join.TYPE_CROSS, entityClass, true);
return joining(SqlConsts.CROSS_JOIN, entityClass, true);
}
public Joiner<QueryWrapper> crossJoin(Class<?> entityClass, boolean when) {
return joining(Join.TYPE_CROSS, entityClass, when);
return joining(SqlConsts.CROSS_JOIN, entityClass, when);
}
public Joiner<QueryWrapper> crossJoin(TableDef table) {
return joining(Join.TYPE_CROSS, new QueryTable(table), true);
return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> crossJoin(TableDef table, boolean when) {
return joining(Join.TYPE_CROSS, new QueryTable(table), when);
return joining(SqlConsts.CROSS_JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> crossJoin(QueryWrapper table) {
return joining(Join.TYPE_CROSS, table, true);
return joining(SqlConsts.CROSS_JOIN, table, true);
}
public Joiner<QueryWrapper> crossJoin(QueryWrapper table, boolean when) {
return joining(Join.TYPE_CROSS, table, when);
return joining(SqlConsts.CROSS_JOIN, table, when);
}
public Joiner<QueryWrapper> join(String table) {
return joining(Join.TYPE_JOIN, new QueryTable(table), true);
return joining(SqlConsts.JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> join(String table, boolean when) {
return joining(Join.TYPE_JOIN, new QueryTable(table), when);
return joining(SqlConsts.JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> join(Class<?> entityClass) {
return joining(Join.TYPE_JOIN, entityClass, true);
return joining(SqlConsts.JOIN, entityClass, true);
}
public Joiner<QueryWrapper> join(Class<?> entityClass, boolean when) {
return joining(Join.TYPE_JOIN, entityClass, when);
return joining(SqlConsts.JOIN, entityClass, when);
}
public Joiner<QueryWrapper> join(TableDef table) {
return joining(Join.TYPE_JOIN, new QueryTable(table), true);
return joining(SqlConsts.JOIN, new QueryTable(table), true);
}
public Joiner<QueryWrapper> join(TableDef table, boolean when) {
return joining(Join.TYPE_JOIN, new QueryTable(table), when);
return joining(SqlConsts.JOIN, new QueryTable(table), when);
}
public Joiner<QueryWrapper> join(QueryWrapper table) {
return joining(Join.TYPE_JOIN, table, true);
return joining(SqlConsts.JOIN, table, true);
}
public Joiner<QueryWrapper> join(QueryWrapper table, boolean when) {
return joining(Join.TYPE_JOIN, table, when);
return joining(SqlConsts.JOIN, table, when);
}

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import java.util.List;
@ -48,7 +49,7 @@ public class RawFragment extends QueryCondition {
if (prevEffectiveCondition != null) {
sql.append(prevEffectiveCondition.connector);
}
sql.append(" ").append(content).append(" ");
sql.append(SqlConsts.BLANK).append(content).append(SqlConsts.BLANK);
}
if (this.next != null) {

View File

@ -45,7 +45,7 @@ public class SelectQueryColumn extends QueryColumn implements HasParamsColumn {
String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
String selectSql = dialect.forSelectByQuery(queryWrapper);
if (StringUtil.isNotBlank(selectSql) && StringUtil.isNotBlank(alias)) {
selectSql = "(" + selectSql + ") AS " + dialect.wrap(alias);
selectSql = WrapperUtil.withAlias(selectSql, dialect.wrap(alias));
}
return selectSql;
}

View File

@ -49,9 +49,9 @@ public class SelectQueryTable extends QueryTable {
public String toSql(IDialect dialect) {
String sql = dialect.buildSelectSql(queryWrapper);
if (StringUtil.isNotBlank(alias)) {
return "(" + sql + ") AS " + dialect.wrap(alias);
return WrapperUtil.withAlias(sql, dialect.wrap(alias));
} else {
return "(" + sql + ")";
return WrapperUtil.withBracket(sql);
}
}

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.SqlUtil;
@ -57,14 +58,23 @@ public class StringFunctionQueryColumn extends QueryColumn {
@Override
public String toSelectSql(List<QueryTable> queryTables, IDialect dialect) {
String sql = StringUtil.join(", ", params);
return StringUtil.isBlank(sql) ? "" : fnName + "(" + sql + ")" + WrapperUtil.buildAsAlias(alias, dialect);
String sql = StringUtil.join(SqlConsts.DELIMITER, params);
if (StringUtil.isBlank(sql)) {
return SqlConsts.EMPTY;
}
if (StringUtil.isBlank(alias)) {
return fnName + WrapperUtil.withBracket(sql);
}
return fnName + WrapperUtil.withAlias(sql, dialect.wrap(alias));
}
@Override
String toConditionSql(List<QueryTable> queryTables, IDialect dialect) {
String sql = StringUtil.join(", ", params);
return StringUtil.isBlank(sql) ? "" : fnName + "(" + sql + ")";
String sql = StringUtil.join(SqlConsts.DELIMITER, params);
if (StringUtil.isBlank(sql)) {
return SqlConsts.EMPTY;
}
return fnName + WrapperUtil.withBracket(sql);
}
@Override

View File

@ -15,6 +15,7 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.util.ObjectUtil;
@ -26,14 +27,14 @@ public class UnionWrapper implements CloneSupport<UnionWrapper> {
public static UnionWrapper union(QueryWrapper queryWrapper) {
UnionWrapper unionWrapper = new UnionWrapper();
unionWrapper.key = " UNION ";
unionWrapper.key = SqlConsts.UNION;
unionWrapper.queryWrapper = queryWrapper;
return unionWrapper;
}
public static UnionWrapper unionAll(QueryWrapper queryWrapper) {
UnionWrapper unionWrapper = new UnionWrapper();
unionWrapper.key = " UNION ALL ";
unionWrapper.key = SqlConsts.UNION_ALL;
unionWrapper.queryWrapper = queryWrapper;
return unionWrapper;
}
@ -59,7 +60,10 @@ public class UnionWrapper implements CloneSupport<UnionWrapper> {
}
public void buildSql(StringBuilder sqlBuilder, IDialect dialect) {
sqlBuilder.append(key).append("(").append(dialect.buildSelectSql(queryWrapper)).append(")");
sqlBuilder.append(key)
.append(SqlConsts.LEFT_BRACKET)
.append(dialect.buildSelectSql(queryWrapper))
.append(SqlConsts.RIGHT_BRACKET);
}
@Override

View File

@ -17,6 +17,7 @@ package com.mybatisflex.core.query;
import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.util.ClassUtil;
import com.mybatisflex.core.util.EnumWrapper;
@ -32,10 +33,6 @@ class WrapperUtil {
private WrapperUtil() {}
static String buildAsAlias(String alias, IDialect dialect) {
return StringUtil.isBlank(alias) ? "" : " AS " + dialect.wrap(alias);
}
static List<QueryWrapper> getChildQueryWrapper(QueryCondition condition) {
List<QueryWrapper> list = null;
while (condition != null) {
@ -131,7 +128,15 @@ class WrapperUtil {
}
static String withBracket(String sql) {
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET;
}
static String withAlias(String sql, String alias) {
return SqlConsts.LEFT_BRACKET + sql + SqlConsts.RIGHT_BRACKET + SqlConsts.AS + alias;
}
static String withAliasIf(String alias, IDialect dialect) {
return StringUtil.isBlank(alias) ? SqlConsts.EMPTY : SqlConsts.AS + dialect.wrap(alias);
}
}

View File

@ -21,6 +21,7 @@ import com.mybatisflex.annotation.SetListener;
import com.mybatisflex.annotation.UpdateListener;
import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.FlexGlobalConfig;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.exception.FlexExceptions;
import com.mybatisflex.core.javassist.ModifyAttrsRecord;
@ -610,12 +611,12 @@ public class TableInfo {
if (versionValue == null) {
throw FlexExceptions.wrap("The version value of entity[%s] must not be null.", entity);
}
queryWrapper.and(QueryCondition.create(schema, tableName, versionColumn, QueryCondition.LOGIC_EQUALS, versionValue));
queryWrapper.and(QueryCondition.create(schema, tableName, versionColumn, SqlConsts.EQUALS, versionValue));
}
//逻辑删除
if (StringUtil.isNotBlank(logicDeleteColumn)) {
queryWrapper.and(QueryCondition.create(schema, tableName, logicDeleteColumn, QueryCondition.LOGIC_EQUALS
queryWrapper.and(QueryCondition.create(schema, tableName, logicDeleteColumn, SqlConsts.EQUALS
, FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete()));
}
@ -623,9 +624,9 @@ public class TableInfo {
Object[] tenantIdArgs = buildTenantIdArgs();
if (ArrayUtil.isNotEmpty(tenantIdArgs)) {
if (tenantIdArgs.length == 1) {
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, QueryCondition.LOGIC_EQUALS, tenantIdArgs[0]));
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.EQUALS, tenantIdArgs[0]));
} else {
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, QueryCondition.LOGIC_IN, tenantIdArgs));
queryWrapper.and(QueryCondition.create(schema, tableName, tenantIdColumn, SqlConsts.IN, tenantIdArgs));
}
}

View File

@ -16,6 +16,7 @@
package com.mybatisflex.core.util;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.constant.SqlConsts;
import com.mybatisflex.core.field.FieldQuery;
import com.mybatisflex.core.field.FieldQueryBuilder;
import com.mybatisflex.core.query.*;
@ -100,7 +101,7 @@ public class MapperUtil {
// 只有全是 left join 语句才会清除 join
// 因为如果是 inner join right join 往往都会放大记录数
for (Join join : joins) {
if (!Join.TYPE_LEFT.equals(CPI.getJoinType(join))) {
if (!SqlConsts.LEFT_JOIN.equals(CPI.getJoinType(join))) {
return false;
}
}