add @Column(version = true) config support

This commit is contained in:
开源海哥 2023-03-02 17:01:34 +08:00
parent 0afe2e5401
commit d99b397699
4 changed files with 94 additions and 13 deletions

View File

@ -54,7 +54,7 @@ public @interface Column {
boolean isLogicDelete() default false; boolean isLogicDelete() default false;
/** /**
* 是否为乐观锁字段如果是的话更新的时候会去检测当前版本号更新成功的话会设置当前版本号 +1 * 是否为乐观锁字段若是乐观锁字段的话数据更新的时候会去检测当前版本号更新成功的话会设置当前版本号 +1
* 只能用于数值的字段 * 只能用于数值的字段
*/ */
boolean version() default false; boolean version() default false;

View File

@ -528,6 +528,12 @@ public class CommonsDialectImpl implements IDialect {
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + " = " + value)); onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + " = " + value));
} }
//乐观锁字段
String versionColumn = tableInfo.getVersionColumn();
if (StringUtil.isNotBlank(versionColumn)) {
stringJoiner.add(wrap(versionColumn) + " = " + wrap(versionColumn) + " + 1 ");
}
sql.append(stringJoiner); sql.append(stringJoiner);
sql.append(" WHERE "); sql.append(" WHERE ");
@ -538,11 +544,19 @@ public class CommonsDialectImpl implements IDialect {
sql.append(wrap(primaryKeys[i])).append(" = ?"); sql.append(wrap(primaryKeys[i])).append(" = ?");
} }
//逻辑删除条件已删除的数据不能被修改
String logicDeleteColumn = tableInfo.getLogicDeleteColumn(); String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
if (StringUtil.isNotBlank(logicDeleteColumn)) { if (StringUtil.isNotBlank(logicDeleteColumn)) {
sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = 0 "); sql.append(" AND ").append(wrap(logicDeleteColumn)).append(" = 0 ");
} }
//乐观锁条件
if (StringUtil.isNotBlank(versionColumn)) {
Object versionValue = tableInfo.getColumnValue(entity, versionColumn);
sql.append(" AND ").append(wrap(versionColumn)).append(" = ").append(versionValue);
}
return sql.toString(); return sql.toString();
} }
@ -553,23 +567,41 @@ public class CommonsDialectImpl implements IDialect {
Set<String> modifyAttrs = tableInfo.obtainUpdateColumns(entity, ignoreNulls, true); Set<String> modifyAttrs = tableInfo.obtainUpdateColumns(entity, ignoreNulls, true);
sql.append("UPDATE ").append(wrap(tableInfo.getTableName())).append(" SET "); sql.append("UPDATE ").append(wrap(tableInfo.getTableName())).append(" SET ");
int index = 0;
StringJoiner stringJoiner = new StringJoiner(", ");
for (String modifyAttr : modifyAttrs) { for (String modifyAttr : modifyAttrs) {
if (index > 0) { stringJoiner.add(wrap(modifyAttr) + " = ?");
sql.append(", ");
}
sql.append(wrap(modifyAttr)).append(" = ? ");
index++;
} }
Map<String, String> onUpdateColumns = tableInfo.getOnUpdateColumns(); Map<String, String> onUpdateColumns = tableInfo.getOnUpdateColumns();
if (onUpdateColumns != null && !onUpdateColumns.isEmpty()) { if (onUpdateColumns != null && !onUpdateColumns.isEmpty()) {
StringJoiner stringJoiner = new StringJoiner(", ");
onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + " = " + value)); onUpdateColumns.forEach((column, value) -> stringJoiner.add(wrap(column) + " = " + value));
sql.append(", ").append(stringJoiner);
} }
//乐观锁字段
String versionColumn = tableInfo.getVersionColumn();
if (StringUtil.isNotBlank(versionColumn)) {
stringJoiner.add(wrap(versionColumn) + " = " + wrap(versionColumn) + " + 1 ");
}
sql.append(stringJoiner);
sql.append(" WHERE "); sql.append(" WHERE ");
//乐观锁条件
if (StringUtil.isNotBlank(versionColumn)) {
Object versionValue = tableInfo.getColumnValue(entity, versionColumn);
queryWrapper.and(new StringQueryCondition(wrap(versionColumn) + " = " + versionValue));
}
//逻辑删除条件已删除的数据不能被修改
String logicDeleteColumn = tableInfo.getLogicDeleteColumn();
if (StringUtil.isNotBlank(logicDeleteColumn)) {
queryWrapper.and(new StringQueryCondition(wrap(logicDeleteColumn) + " = 0"));
}
sql.append(buildWhereConditionSql(queryWrapper)); sql.append(buildWhereConditionSql(queryWrapper));
return sql.toString(); return sql.toString();

View File

@ -58,6 +58,9 @@ public class EntitySqlProvider {
TableInfo tableInfo = ProviderUtil.getTableInfo(context); TableInfo tableInfo = ProviderUtil.getTableInfo(context);
//设置乐观锁版本字段的初始化
tableInfo.initVersionValueIfNecessary(entity);
Object[] values = tableInfo.obtainInsertValues(entity); Object[] values = tableInfo.obtainInsertValues(entity);
ProviderUtil.setSqlArgs(params, values); ProviderUtil.setSqlArgs(params, values);
@ -81,6 +84,10 @@ public class EntitySqlProvider {
} }
TableInfo tableInfo = ProviderUtil.getTableInfo(context); TableInfo tableInfo = ProviderUtil.getTableInfo(context);
for (Object entity : entities) {
tableInfo.initVersionValueIfNecessary(entity);
}
Object[] values = new Object[0]; Object[] values = new Object[0];
for (Object entity : entities) { for (Object entity : entities) {
values = ArrayUtil.concat(values, tableInfo.obtainInsertValues(entity)); values = ArrayUtil.concat(values, tableInfo.obtainInsertValues(entity));

View File

@ -22,6 +22,7 @@ import com.mybatisflex.core.row.Row;
import com.mybatisflex.core.util.ArrayUtil; import com.mybatisflex.core.util.ArrayUtil;
import com.mybatisflex.core.util.ClassUtil; import com.mybatisflex.core.util.ClassUtil;
import com.mybatisflex.core.util.CollectionUtil; import com.mybatisflex.core.util.CollectionUtil;
import com.mybatisflex.core.util.StringUtil;
import org.apache.ibatis.mapping.ResultFlag; import org.apache.ibatis.mapping.ResultFlag;
import org.apache.ibatis.mapping.ResultMap; import org.apache.ibatis.mapping.ResultMap;
import org.apache.ibatis.mapping.ResultMapping; import org.apache.ibatis.mapping.ResultMapping;
@ -285,7 +286,12 @@ public class TableInfo {
} }
for (String property : properties) { for (String property : properties) {
String column = getColumnByProperty(property); String column = getColumnByProperty(property);
if (onUpdateColumns != null && onUpdateColumns.containsKey(column)){ if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
continue;
}
//过滤乐观锁字段
if (Objects.equals(column, versionColumn)) {
continue; continue;
} }
@ -302,7 +308,12 @@ public class TableInfo {
//not ModifyAttrsRecord //not ModifyAttrsRecord
else { else {
for (String column : this.columns) { for (String column : this.columns) {
if (onUpdateColumns != null && onUpdateColumns.containsKey(column)){ if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
continue;
}
//过滤乐观锁字段
if (Objects.equals(column, versionColumn)) {
continue; continue;
} }
@ -343,7 +354,11 @@ public class TableInfo {
} }
for (String property : properties) { for (String property : properties) {
String column = getColumnByProperty(property); String column = getColumnByProperty(property);
if (onUpdateColumns != null && onUpdateColumns.containsKey(column)){ if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
continue;
}
//过滤乐观锁字段
if (Objects.equals(column, versionColumn)) {
continue; continue;
} }
@ -360,7 +375,12 @@ public class TableInfo {
// normal entity. not ModifyAttrsRecord // normal entity. not ModifyAttrsRecord
else { else {
for (String column : this.columns) { for (String column : this.columns) {
if (onUpdateColumns != null && onUpdateColumns.containsKey(column)){ if (onUpdateColumns != null && onUpdateColumns.containsKey(column)) {
continue;
}
//过滤乐观锁字段
if (Objects.equals(column, versionColumn)) {
continue; continue;
} }
@ -433,6 +453,11 @@ public class TableInfo {
return getPropertyValue(metaObject, columnPropertyMapping.get(column)); return getPropertyValue(metaObject, columnPropertyMapping.get(column));
} }
public Object getColumnValue(Object entityObject, String column) {
MetaObject metaObject = EntityMetaObject.forObject(entityObject, reflectorFactory);
return getPropertyValue(metaObject, columnPropertyMapping.get(column));
}
private Object getPropertyValue(MetaObject metaObject, String property) { private Object getPropertyValue(MetaObject metaObject, String property) {
if (property != null && metaObject.hasGetter(property)) { if (property != null && metaObject.hasGetter(property)) {
@ -463,4 +488,21 @@ public class TableInfo {
} }
return (T) instance; return (T) instance;
} }
/**
* 初始化乐观锁版本号
*
* @param entityObject
*/
public void initVersionValueIfNecessary(Object entityObject) {
if (StringUtil.isBlank(versionColumn)) {
return;
}
MetaObject metaObject = EntityMetaObject.forObject(entityObject, reflectorFactory);
Object columnValue = getColumnValue(entityObject, versionColumn);
if (columnValue == null) {
metaObject.setValue(columnPropertyMapping.get(versionColumn), 0);
}
}
} }