feat: add BaseMapper.updateNumberAddByQuery() method

This commit is contained in:
开源海哥 2023-05-26 14:08:24 +08:00
parent 5168dbd786
commit 29489e2ca6
12 changed files with 148 additions and 4 deletions

View File

@ -278,6 +278,33 @@ public interface BaseMapper<T> {
int updateByQuery(@Param(FlexConsts.ENTITY) T entity, @Param(FlexConsts.IGNORE_NULLS) boolean ignoreNulls, @Param(FlexConsts.QUERY) QueryWrapper queryWrapper);
/**
* 执行类似 update table set field=field+1 where ... 的场景
*
* @param fieldName 字段名
* @param value >=0 小于 0
* @param queryWrapper 条件
* @see EntitySqlProvider#updateNumberAddByQuery(Map, ProviderContext)
*/
@UpdateProvider(type = EntitySqlProvider.class, method = "updateNumberAddByQuery")
int updateNumberAddByQuery(@Param(FlexConsts.FIELD_NAME) String fieldName, @Param(FlexConsts.VALUE) Number value, @Param(FlexConsts.QUERY) QueryWrapper queryWrapper);
/**
* 执行类似 update table set field=field+1 where ... 的场景
*
* @param fn 字段名
* @param value >=0 小于 0
* @param queryWrapper 条件
* @see EntitySqlProvider#updateNumberAddByQuery(Map, ProviderContext)
*/
default int updateNumberAddByQuery(LambdaGetter<T> fn, Number value, QueryWrapper queryWrapper) {
TableInfo tableInfo = TableInfoFactory.ofMapperClass(ClassUtil.getUsefulClass(getClass()));
String column = tableInfo.getColumnByProperty(LambdaUtil.getFieldName(fn));
return updateNumberAddByQuery(column, value, queryWrapper);
}
/**
* 根据主键来选择数据
*

View File

@ -27,8 +27,10 @@ public class FlexConsts {
public static final String SQL = "$$sql";
public static final String SQL_ARGS = "$$sql_args";
public static final String TABLE_NAME = "$$tableName";
public static final String FIELD_NAME = "$$fieldName";
public static final String PRIMARY_KEY = "$$primaryKey";
public static final String PRIMARY_VALUE = "$$primaryValue";
public static final String VALUE = "$$value";
public static final String QUERY = "$$query";
public static final String ROW = "$$row";

View File

@ -70,6 +70,8 @@ public interface IDialect {
String forUpdateEntityByQuery(TableInfo tableInfo, Object entity, boolean ignoreNulls, QueryWrapper queryWrapper);
String forUpdateNumberAddByQuery(String tableName, String fieldName, Number value, QueryWrapper queryWrapper);
String forSelectOneEntityById(TableInfo tableInfo);
String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues);

View File

@ -667,6 +667,33 @@ public class CommonsDialectImpl implements IDialect {
return sql.toString();
}
@Override
public String forUpdateNumberAddByQuery(String tableName, String fieldName, Number value, QueryWrapper queryWrapper) {
StringBuilder sql = new StringBuilder();
sql.append("UPDATE ").append(forHint(CPI.getHint(queryWrapper))).append(wrap(tableName)).append(" SET ");
sql.append(wrap(fieldName)).append("=").append(wrap(fieldName)).append(value.intValue() >= 0 ? " + " : " - ").append(Math.abs(value.longValue()));
String whereConditionSql = buildWhereConditionSql(queryWrapper);
//不允许全量更新
if (StringUtil.isBlank(whereConditionSql)) {
throw new IllegalArgumentException("Not allowed UPDATE a table without where condition.");
}
sql.append(" WHERE ").append(whereConditionSql);
List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) {
for (String endFragment : endFragments) {
sql.append(" ").append(endFragment);
}
}
return sql.toString();
}
@Override
public String forSelectOneEntityById(TableInfo tableInfo) {
StringBuilder sql = buildSelectColumnSql(null, null, null);

View File

@ -247,6 +247,32 @@ public class EntitySqlProvider {
return DialectFactory.getDialect().forUpdateEntityByQuery(tableInfo, entity, ignoreNulls, queryWrapper);
}
/**
* updateNumberByQuery sql 构建
*
* @param params
* @param context
* @return sql
* @see com.mybatisflex.core.BaseMapper#updateNumberAddByQuery(String, Number, QueryWrapper)
*/
public static String updateNumberAddByQuery(Map params, ProviderContext context) {
QueryWrapper queryWrapper = ProviderUtil.getQueryWrapper(params);
String fieldName = ProviderUtil.getFieldName(params);
Number value = (Number) ProviderUtil.getValue(params);
TableInfo tableInfo = ProviderUtil.getTableInfo(context);
//处理逻辑删除 多租户等
tableInfo.appendConditions(null, queryWrapper);
Object[] queryParams = CPI.getValueArray(queryWrapper);
ProviderUtil.setSqlArgs(params, queryParams);
return DialectFactory.getDialect().forUpdateNumberAddByQuery(tableInfo.getTableName(), fieldName, value, queryWrapper);
}
/**
* selectOneById sql 构建
@ -350,10 +376,6 @@ public class EntitySqlProvider {
}
private static List<TableInfo> getTableInfos(ProviderContext context, QueryWrapper queryWrapper) {
List<TableInfo> tableInfos;
List<QueryTable> queryTables = CPI.getQueryTables(queryWrapper);

View File

@ -91,6 +91,13 @@ class ProviderUtil {
return params.get(FlexConsts.ENTITY);
}
public static String getFieldName(Map params) {
return (String) params.get(FlexConsts.FIELD_NAME);
}
public static Object getValue(Map params) {
return params.get(FlexConsts.VALUE);
}
public static List<Object> getEntities(Map params) {
return (List<Object>) params.get(FlexConsts.ENTITIES);

View File

@ -244,6 +244,28 @@ public class RowSqlProvider {
return DialectFactory.getDialect().forUpdateEntity(tableInfo, entity, false);
}
/**
* 执行类似 update table set field=field+1 where ... 的场景
*
* @param params
* @return sql
* @see RowMapper#updateNumberAddByQuery(String, String, Number, QueryWrapper)
*/
public static String updateNumberAddByQuery(Map params) {
QueryWrapper queryWrapper = ProviderUtil.getQueryWrapper(params);
String tableName = ProviderUtil.getTableName(params);
String fieldName = ProviderUtil.getFieldName(params);
Number value = (Number) ProviderUtil.getValue(params);
Object[] queryParams = CPI.getValueArray(queryWrapper);
ProviderUtil.setSqlArgs(params, queryParams);
return DialectFactory.getDialect().forUpdateNumberAddByQuery(tableName, fieldName, value, queryWrapper);
}
/**

View File

@ -286,6 +286,7 @@ public class Db {
})).sum();
}
/**
* 根据主键来批量更新数据
*
@ -297,6 +298,11 @@ public class Db {
}
public static int updateNumberAddByQuery(String tableName, String fieldName, Number value, QueryWrapper queryWrapper){
return invoker().updateNumberAddByQuery(tableName, fieldName, value, queryWrapper);
}
/**
* 批量执行工具方法
*

View File

@ -198,6 +198,20 @@ public interface RowMapper {
@UpdateProvider(value = RowSqlProvider.class, method = "updateEntity")
int updateEntity(@Param(FlexConsts.ENTITY) Object entity);
/**
* 执行类似 update table set field=field+1 where ... 的场景
*
* @param fieldName 字段名
* @param value >=0 小于 0
* @param queryWrapper 条件
* @see RowSqlProvider#updateNumberAddByQuery(Map)
*/
@UpdateProvider(type = RowSqlProvider.class, method = "updateNumberAddByQuery")
int updateNumberAddByQuery(@Param(FlexConsts.TABLE_NAME) String tableName, @Param(FlexConsts.FIELD_NAME) String fieldName
, @Param(FlexConsts.VALUE) Number value, @Param(FlexConsts.QUERY) QueryWrapper queryWrapper);
///////select /////
/**

View File

@ -185,4 +185,7 @@ public class RowMapperInvoker {
}
public int updateNumberAddByQuery(String tableName, String fieldName, Number value, QueryWrapper queryWrapper) {
return execute(mapper -> mapper.updateNumberAddByQuery(tableName, fieldName, value, queryWrapper));
}
}

View File

@ -266,6 +266,10 @@ public class TableInfo {
return columnInfoList;
}
public String getColumnByProperty(String property) {
return propertyColumnMapping.get(property);
}
void setColumnInfoList(List<ColumnInfo> columnInfoList) {
this.columnInfoList = columnInfoList;

View File

@ -71,6 +71,14 @@ public class EntityTestStarter {
RowUtil.printPretty(rowList);
accountMapper.updateNumberAddByQuery("age", 100, QueryWrapper.create().where(ACCOUNT.ID.eq(1)));
accountMapper.updateNumberAddByQuery(Account::getAge, -50, QueryWrapper.create().where(ACCOUNT.ID.eq(1)));
Db.updateNumberAddByQuery("tb_account", "age", 30, QueryWrapper.create().where(ACCOUNT.ID.eq(1)));
Db.updateNumberAddByQuery("tb_account", "age", -20, QueryWrapper.create().where(ACCOUNT.ID.eq(1)));
List<Account> accounts1 = accountMapper.selectListByQuery(QueryWrapper.create()
, accountFieldQueryBuilder -> accountFieldQueryBuilder
.field(Account::getArticles)