springboot+mybatis整合封装时,缓存机制的疑问

最近自己在学习和封装 springboot+mybatis,目前在 mapper 这里卡壳,主要就是 update 的时候总感觉有问题。
首先,我自己封装了 SqlFactory 类,用于自动生成 sql,主要采用反射机制(自己定义的注解,注解表名和字段信息,没有采用JPA)处理,然后对 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;
    }

mapper 接口层去注解:

@UpdateProvider(type = SqlFactory.class, method = "getUpdateSql")
void updateObj (Object obj) throws Exception;

最开始我是想直接放弃掉采用二级缓存,甚至一级缓存。所有的操作全部走 sql。但是后来想想感觉还是会缺少一些东西,然后就想加上二级缓存,那么整个下来致使就会有一些问题。
问题 1:若我不用缓存,那么我前端页面就要将所有字段放入,可能很多字段需要隐藏,否则更新的时候,obj 里面是空,那么 update 的时候就将原先可能很重要的字段的值直接给清掉了。尤其是我可能会因业务需要在后面对表字段进行增加,然后这个值主要靠后端去变更,但是前端忘记给隐藏了,那么最后可能导致后端做了无用功。
问题 2:若我用缓存,那么前端页面将某个有值的非空字段的值编辑为空,或者说在后端操作,将某个字段 set 为空,再去 update,那么去缓存取值,此时,这个我想要这个变为空的字段,它实际是不会的。

上述,有没有大佬解决一哈子????

阅读 2.2k
2 个回答
✓ 已被采纳新手上路,请多包涵
  1. 前端调用更新,参数接收采用map去接,不用object。
  2. 后端内部调用,必定是先得到一个完整的实体或者object,然后再去set某些字段的值,这就可以直接调用当前用object接参的形式。

3. 总结,需要两个update的接口方法,分别去实现object接参和map接参。避免使用缓存带来的一系列问题。

类似jpa的orm,需要先查询,人后针对特定字段设置,最后保存
和mybatis看起来关系不大

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题