关于 mybatis 或者 Hibernate 的缓存机制的疑问

2019-07-29 11:34:25 +08:00
 JarvisRay
最近自己在学习和封装 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,那么去缓存取值,此时,这个我想要这个变为空的字段,它实际是不会的。

上述,有没有大佬解决一哈子????
877 次点击
所在节点    Java
7 条回复
taogen
2019-07-29 12:38:52 +08:00
代码请用 markdown 格式
QQQQQQQ
2019-07-29 15:27:41 +08:00
在 update 时候先查一下,然后把前台的值挨个 set ?还有就是 mybatisplus 中的 updateById 和 updateAllColumnById 这俩方法参考下。菜鸡只能帮这么多了。
LeeSeoung
2019-07-29 16:17:54 +08:00
Spring Data JPA?
JarvisRay
2019-07-29 16:59:03 +08:00
@LeeSeoung 不,我知道怎么解决了
JarvisRay
2019-07-29 17:01:35 +08:00
结帖,结帖,知道怎么解决了,接收参数用 map,这样我通过 map 的 key 去创建语句,map 里面(实际就是 key )有哪些字段那么 sql 语句就 set 哪些字段,也就不会造就我说的两个问题了。
hangszhang
2019-07-30 00:15:38 +08:00
不要用 MyBatis 或者 Hibernate 的缓存,建议自己在本地缓存,guava cache
JarvisRay
2019-07-30 14:36:37 +08:00
@hangszhang 打算采用 redis,MyBatis 或者 Hibernate 的缓存直接放弃了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/587089

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX