最近自己在学习和封装 springboot+mybatis,目前在 maaper 这里卡壳,主要就是 update 的时候总感觉有问题。
首先,我自己封装了 SqlFactory 类,用于自动生成 sql,然后对 maaper 接口层采用注解
大致代码如下:
SqlFactory 类中创建更新 sql 语句:
public String getUpdateSql(final Object obj) throws Exception{
final Class<?> clazz = obj.getClass();
DbTable table = clazz.getAnnotation(DbTable.class);
final String tableName =
table.name();
String sql = new SQL(){{
UPDATE(tableName);
List<Field> fields = ClassReflection.getAllField(clazz);
for (Field field : fields) {
if(field.getAnnotation(tableField.class) != null){//tableField.class
String fieldName = field.getName();
String jdbcType = getJdbcType(field);
SET(StrProc.toDataFiled(fieldName)+"=#{"+fieldName+",jdbcType=" + jdbcType + "}");
}
}
WHERE("id=#{id}");
}}.toString();
log.debug("sql : {}",sql.replace("\n", " "));
return sql;
}
private String getJdbcType(Field field){
Class<?> clazz = field.getType();
if(clazz == String.class){
return "VARCHAR";
}else if(clazz == Integer.class || clazz == Double.class || clazz == Float.class){
return "NUMERIC";
}else if(clazz == Date.class){
return "TIMESTAMP";
}
return "OTHER";
}
maaper 接口层去注解:
@
UpdateProvider(type = SqlFactory.class, method = "getUpdateSql")
void updateObj (Object obj) throws Exception;
最开始我是想直接放弃掉采用二级缓存,甚至一级缓存。所有的操作全部走 sql。但是后来想想感觉还是会缺少一些东西,然后就想加上二级缓存,那么整个下来致使就会有一些问题。
问题 1:若我不用缓存,那么我前端页面就要将所有字段放入,可能很多字段需要隐藏,否则更新的时候,obj 里面是空,那么 update 的时候就将原先可能很重要的字段的值直接给清掉了。尤其是我可能会因业务需要在后面对表字段进行增加,然后这个值主要靠后端去变更,但是前端忘记给隐藏了,那么最后可能导致后端做了无用功。
问题 2:若我用缓存,那么前端页面将某个有值的非空字段的值编辑为空,或者说在后端操作,将某个字段 set 为空,再去 update,那么去缓存取值,此时,这个我想要这个变为空的字段,它实际是不会的。
上述,有没有大佬解决一哈子????
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/587089
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.