1
回答
Model对象set方法中的getModifyFlag().add(attr);有什么用?求解~~
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

@JFinal 你好,想跟你请教个问题:

    Model.set时即将属性的键值对put到attrs(HashMap)中,同时也预存属性名称到getModifyFlag().add(attr),注释说在update()方法中会用到这个信息。

public M set(String attr, Object value) {
		if (tableInfoMapping.getTableInfo(getClass()).hasColumnLabel(attr)) {
			attrs.put(attr, value);
			getModifyFlag().add(attr);	// Add modify flag, update() need this flag.
			return (M)this;
		}
		throw new ActiveRecordException("The attribute name is not exists: " + attr);
	}
mysql的update()实现方法:

public void forModelUpdate(TableInfo tableInfo, Map<String, Object> attrs, Set<String> modifyFlag, String primaryKey, Object id, StringBuilder sql, List<Object> paras) {
		sql.append("update `").append(tableInfo.getTableName()).append("` set ");
		for (Entry<String, Object> e : attrs.entrySet()) {
			String colName = e.getKey();
			if (!primaryKey.equalsIgnoreCase(colName) && modifyFlag.contains(colName) && tableInfo.hasColumnLabel(colName)) {
				if (paras.size() > 0)
					sql.append(", ");
				sql.append("`").append(colName).append("` = ? ");
				paras.add(e.getValue());
			}
		}
		sql.append(" where `").append(primaryKey).append("` = ?");	// .append(" limit 1");
		paras.add(id);
	}
问题是:tableInfo.hasColumnLabel(colName)这个判断已经能保证update sql中不好拼接进非表字段信息,那为什么还要modifyFlag.contains(colName)先判断一下呢?请问这么设计是基于什么考虑的呢?谢谢~~

@缪斯的情人@绝望的八皮@alvinte@玛雅牛 多谢各位!!!

举报
pandyyan
发帖于4年前 1回/480阅
顶部