V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JarvisRay
V2EX  ›  Java

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

  •  
  •   JarvisRay · 2019-07-29 11:34:25 +08:00 · 879 次点击
    这是一个创建于 1979 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近自己在学习和封装 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,那么去缓存取值,此时,这个我想要这个变为空的字段,它实际是不会的。

    上述,有没有大佬解决一哈子????
    7 条回复    2019-07-30 14:36:37 +08:00
    taogen
        1
    taogen  
       2019-07-29 12:38:52 +08:00 via Android
    代码请用 markdown 格式
    QQQQQQQ
        2
    QQQQQQQ  
       2019-07-29 15:27:41 +08:00
    在 update 时候先查一下,然后把前台的值挨个 set ?还有就是 mybatisplus 中的 updateById 和 updateAllColumnById 这俩方法参考下。菜鸡只能帮这么多了。
    LeeSeoung
        3
    LeeSeoung  
       2019-07-29 16:17:54 +08:00
    Spring Data JPA?
    JarvisRay
        4
    JarvisRay  
    OP
       2019-07-29 16:59:03 +08:00
    @LeeSeoung 不,我知道怎么解决了
    JarvisRay
        5
    JarvisRay  
    OP
       2019-07-29 17:01:35 +08:00
    结帖,结帖,知道怎么解决了,接收参数用 map,这样我通过 map 的 key 去创建语句,map 里面(实际就是 key )有哪些字段那么 sql 语句就 set 哪些字段,也就不会造就我说的两个问题了。
    hangszhang
        6
    hangszhang  
       2019-07-30 00:15:38 +08:00
    不要用 MyBatis 或者 Hibernate 的缓存,建议自己在本地缓存,guava cache
    JarvisRay
        7
    JarvisRay  
    OP
       2019-07-30 14:36:37 +08:00
    @hangszhang 打算采用 redis,MyBatis 或者 Hibernate 的缓存直接放弃了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2746 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:57 · PVG 17:57 · LAX 01:57 · JFK 04:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.