mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-08 01:28:24 +08:00
feat: add BaseMapper.updateNumberAddByQuery() method
This commit is contained in:
parent
5168dbd786
commit
29489e2ca6
@ -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);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据主键来选择数据
|
* 根据主键来选择数据
|
||||||
*
|
*
|
||||||
|
|||||||
@ -27,8 +27,10 @@ public class FlexConsts {
|
|||||||
public static final String SQL = "$$sql";
|
public static final String SQL = "$$sql";
|
||||||
public static final String SQL_ARGS = "$$sql_args";
|
public static final String SQL_ARGS = "$$sql_args";
|
||||||
public static final String TABLE_NAME = "$$tableName";
|
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_KEY = "$$primaryKey";
|
||||||
public static final String PRIMARY_VALUE = "$$primaryValue";
|
public static final String PRIMARY_VALUE = "$$primaryValue";
|
||||||
|
public static final String VALUE = "$$value";
|
||||||
|
|
||||||
public static final String QUERY = "$$query";
|
public static final String QUERY = "$$query";
|
||||||
public static final String ROW = "$$row";
|
public static final String ROW = "$$row";
|
||||||
|
|||||||
@ -70,6 +70,8 @@ public interface IDialect {
|
|||||||
|
|
||||||
String forUpdateEntityByQuery(TableInfo tableInfo, Object entity, boolean ignoreNulls, QueryWrapper queryWrapper);
|
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 forSelectOneEntityById(TableInfo tableInfo);
|
||||||
|
|
||||||
String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues);
|
String forSelectEntityListByIds(TableInfo tableInfo, Object[] primaryValues);
|
||||||
|
|||||||
@ -667,6 +667,33 @@ public class CommonsDialectImpl implements IDialect {
|
|||||||
return sql.toString();
|
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
|
@Override
|
||||||
public String forSelectOneEntityById(TableInfo tableInfo) {
|
public String forSelectOneEntityById(TableInfo tableInfo) {
|
||||||
StringBuilder sql = buildSelectColumnSql(null, null, null);
|
StringBuilder sql = buildSelectColumnSql(null, null, null);
|
||||||
|
|||||||
@ -247,6 +247,32 @@ public class EntitySqlProvider {
|
|||||||
return DialectFactory.getDialect().forUpdateEntityByQuery(tableInfo, entity, ignoreNulls, queryWrapper);
|
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 构建
|
* selectOneById 的 sql 构建
|
||||||
@ -350,10 +376,6 @@ public class EntitySqlProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static List<TableInfo> getTableInfos(ProviderContext context, QueryWrapper queryWrapper) {
|
private static List<TableInfo> getTableInfos(ProviderContext context, QueryWrapper queryWrapper) {
|
||||||
List<TableInfo> tableInfos;
|
List<TableInfo> tableInfos;
|
||||||
List<QueryTable> queryTables = CPI.getQueryTables(queryWrapper);
|
List<QueryTable> queryTables = CPI.getQueryTables(queryWrapper);
|
||||||
|
|||||||
@ -91,6 +91,13 @@ class ProviderUtil {
|
|||||||
return params.get(FlexConsts.ENTITY);
|
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) {
|
public static List<Object> getEntities(Map params) {
|
||||||
return (List<Object>) params.get(FlexConsts.ENTITIES);
|
return (List<Object>) params.get(FlexConsts.ENTITIES);
|
||||||
|
|||||||
@ -244,6 +244,28 @@ public class RowSqlProvider {
|
|||||||
|
|
||||||
return DialectFactory.getDialect().forUpdateEntity(tableInfo, entity, false);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -286,6 +286,7 @@ public class Db {
|
|||||||
})).sum();
|
})).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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量执行工具方法
|
* 批量执行工具方法
|
||||||
*
|
*
|
||||||
|
|||||||
@ -198,6 +198,20 @@ public interface RowMapper {
|
|||||||
@UpdateProvider(value = RowSqlProvider.class, method = "updateEntity")
|
@UpdateProvider(value = RowSqlProvider.class, method = "updateEntity")
|
||||||
int updateEntity(@Param(FlexConsts.ENTITY) Object entity);
|
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 /////
|
///////select /////
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -266,6 +266,10 @@ public class TableInfo {
|
|||||||
return columnInfoList;
|
return columnInfoList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getColumnByProperty(String property) {
|
||||||
|
return propertyColumnMapping.get(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void setColumnInfoList(List<ColumnInfo> columnInfoList) {
|
void setColumnInfoList(List<ColumnInfo> columnInfoList) {
|
||||||
this.columnInfoList = columnInfoList;
|
this.columnInfoList = columnInfoList;
|
||||||
|
|||||||
@ -71,6 +71,14 @@ public class EntityTestStarter {
|
|||||||
RowUtil.printPretty(rowList);
|
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()
|
List<Account> accounts1 = accountMapper.selectListByQuery(QueryWrapper.create()
|
||||||
, accountFieldQueryBuilder -> accountFieldQueryBuilder
|
, accountFieldQueryBuilder -> accountFieldQueryBuilder
|
||||||
.field(Account::getArticles)
|
.field(Account::getArticles)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user