关于 mybatis 或者 Hibernate 的缓存机制的疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JarvisRay
V2EX    Java

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

  •  
  •   JarvisRay 2019-07-29 11:34:25 +08:00 1206 次点击
    这是一个创建于 2268 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近自己在学习和封装 springboot+mybatis,目前在 maaper 这里卡壳,主要就是 update 的时候总感觉有问题。
    首先,我自己封装了 SqlFactory 类,用于自动生成 sql,然后对 maaper 接口层采用注解
    大致代码如下:
    SqlFactory 类中创建更新 sql 语句:
    public String getUpdateSql(final Object obj) throws Exception{
    final Class<?&t; 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     Solana     1071 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:03 PVG 07:03 LAX 16:03 JFK 19:03
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86