【操作日志】如何在一个SpringBoot+Mybatis的项目中设计一个自定义ChangeLog记录?

这篇具有很好参考价值的文章主要介绍了【操作日志】如何在一个SpringBoot+Mybatis的项目中设计一个自定义ChangeLog记录?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  设计一个业务改动信息时的自定义记录,例如新增、修改、删除数据等。并且记录的规则可以通过配置的方式控制。大家需要根据各自业务场景参考,欢迎讨论。伪代码如下:

实体类:

@TableName("tbl_user")
User{
    String id
    String name
    Integer age
    String addr
}

 



DAO层:

UserDao{
    getById(Long id);
    list(Wrapper wrapper);
}

 

 

自定义注解:

MybatisPropAnno{

  String value

  Class<?> daoClazz

}

 



Http接口请求参数:

SaveReq{
    @MybatisPropAnno(value="name", daoClazz = UserDao.class)
    String userName;
    @MybatisPropAnno(value="age", daoClazz = UserDao.class)
    Integer userAge;
}

UpdateReq{
    @MybatisPropAnno(value="id", daoClazz = UserDao.class)
    String userNo;
    @MybatisPropAnno(value="name", daoClazz = UserDao.class)
    String userName;
    @MybatisPropAnno(value="age", daoClazz = UserDao.class)
    Integer userAge;

    @MybatisPropAnno(value="id", daoClazz = DepartDao.class)
    String departId;
    String departAddress;
}

 



Http接口:

TestController{
    public void save(SaveReq saveReq){
        operTypeInheritedThreadLocal.set(Enum."添加数据");
        sthInheritedThreadLocal.set(saveReq);
    };

    public void update(UpdateReq updateReq){
        operTypeInheritedThreadLocal.set(Enum."更新数据");
        sthInheritedThreadLocal.set(updateReq);
    };

    @MybatisLogAnno("删除数据")
    public void delete(){};

    @MybatisLogAnno("查询数据")
    public void query(){};

    public void other(){};
}

 



SQL拦截器:

SqlInterceptor{
    public Object intercept(Mybatis param){    
        OperType operType = operTypeInheritedThreadLocal.get
        if(operType == null){
            return ;
        }
        
        // insert/update/delete/select
        String type = param.getSqlType();
        if(operType == select){
            return ;
        }
        
        String sql = param.getSql();
        
        String tableName = sql.getTableName();

        List<Field> fields = Reflect.getFields(sthInheritedThreadLocal.get());

        for(Field field : fields){
            MybatisPropAnno propAnno = field.getAnnotation(MybatisPropAnno);
            if(propAnno  == null){
                continue;
            }
            if(propAnno.getDaoClazz.getEntity.getTableName.equals(tableName )){
                User oldUser = new JSONObject();
                User newUser = new JSONObject();
                if(type == insert){
                    oldUser = new JSONObject();
                    newUser = getInsertInfo(sql);
                }

                if(type == update){
                    oldUser = SpringContext.get(daoClazz).getById(field.value());
                    newUser = getUpdateInfo(sql);
                    insertChangeLog(new JSONObject(), JSON.toJson(newUser));
                }
                if(type == delete){
                    oldUser = SpringContext.get(daoClazz).getById(field.value());
                    newUser = new JSONObject();
                }

                insertChangeLog(operType, traceId, oldUser, newUser);
                break;
            }
        }
    }
}

 



Spring切面:

SpringAop {
    public Object doAround(){
        operTypeInheritedThreadLocal.remove
    }
}

 



数据库设计:
Table:dc_change_log
id    changeTime    changeType    traceId    oldInfo        newInfo        httpMethod        table        operator    changeDesc
1    2020-01-01    添加用户        123    {}        {"name":"lil"}    com.xx.TestCtrl.saveUser    tbl_user        admin    descxxxxxxxxxxxx
2    2020-01-01    修改用户        124    {"name":"lil"}    {"name":"a"}    com.xx.TestCtrl.updateUser    tbl_user        admin    descxxxxxxxxxxxx
3    2020-01-01    修改用户        124    {"addr":"南山"}    {"addr":"福田"}    com.xx.TestCtrl.updateUser    tbl_department    admin    descxxxxxxxxxxxx

Table:dc_change_rule
id    httpMethod        table        showRule
1    com.xx.TestCtrl.saveUser    tbl_user        [{"propKey":"name", "propDesc":"name detail info"}]
1    com.xx.TestCtrl.updateUser    tbl_user        [{"propKey":"name", "propDesc":"name detail info"}]
1    com.xx.TestCtrl.updateUser    tbl_department    [{"propKey":"addr", "propDesc":"addr detail info"}]文章来源地址https://www.toymoban.com/news/detail-461520.html

到了这里,关于【操作日志】如何在一个SpringBoot+Mybatis的项目中设计一个自定义ChangeLog记录?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个可以通过多个条件筛选的系统界面是如何实现的(springboot+mybatis)

    比如我们有一个订单记录管理界面 条件可以通过订单号、商品名称、创建日期范围、价格范围。。。来进行筛选查询。首先我们先确定数据库订单表(我这里就不做连表了,都放在一个表中)模拟一个订单表 order表 订单号     商品名称     创建日期     价格     地址  

    2024年02月13日
    浏览(41)
  • 如何快速搭建一个SpringBoot项目

    前面我们了解了SpringBoot背景和特点,本节我们主要介绍如何快速构建一个SpringBoot项目,以此来提升日常开发效率。 SpringBoot是搭建应用的手脚架,由Spring公司的核心团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Sp

    2024年02月02日
    浏览(47)
  • Springboot + MyBatis 进行日志输出

      书接上回,咱们处理完成 druid 数据源连接池日志后,所有执行sql的日志都可以打印出来了,但是问题也是接踵而来,日志文件中密密麻麻都是日志,而当我想要 查看某个dao的sql 或者 想要通过sql找到其所在dao 是非常困难的,通过考虑决定,将druid日志输出到一个单独的日

    2024年02月13日
    浏览(53)
  • 如何从0到1搭建一个SpringBoot项目

    SpringBoot是大家使用最多的一个Java框架了,今日就来详细介绍一下如何去创建一个SpringBoot项目 首先要来看你的IDEA版本,如果你的IDEA是【专业版】的,那么你就无需安装任何的插件,直接就可以创建 SpringBoot 的项目了 但如果你的IDEA版本是【社区版】的话,就需要考虑地仔细

    2024年02月03日
    浏览(37)
  • git clone 一个 SpringBoot 项目,如何在本地运行?

    点击apply、ok 找到.xml文件,点击reload project 导入依赖项目就可以运行

    2024年02月17日
    浏览(46)
  • 【Spring框架全系列】如何创建一个SpringBoot项目

    🌇哈喽,大家好,我是小浪。前几篇博客我们已经介绍了什么是Spring,以及如何创建一个Spring项目,OK,那么单单掌握Spring是完全不够的,Spring的家族体系十分强大,我们还需要深入学习,以便于我们后续达到能独立做项目的水平。今天我们来学习SpringBoot。🏜 📲目录 一、

    2024年02月03日
    浏览(49)
  • 如何在idea中创建一个SpringBoot项目(超详细教学)

    目录 环境准备 1.1打开IDEA,点击New新建一个项目 1.2 使用Spring Initializr方式构建Spring Boot项目  1.3 设置项目所属组,项目名称,选择java版本  1.4 选择对应的SpringBoot版本 1.5 再次设置项目名称,选择存储项目的路径,点击创建  1.6 创建成功  1.7 编写测试方法 1.7.1 启动端口  

    2024年02月02日
    浏览(63)
  • springboot+mybatis 配置 logback 日志 并打印sql

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 springboot + logback 日志 提示:以下是本篇文章正文内容,下面案例可供参考 ` 使用时注意: 配置日志文件保存路径 默认用户目录 自定义指定需要打印日志的文件路径 参考连接: 很详细 是干货 SpringBoo

    2024年02月19日
    浏览(50)
  • Spring日志完结篇,MyBatis操作数据库(入门)

    目录 Spring可以对日志进行分目录打印 日志持久化(让日志进行长期的保存) MyBatis操作数据库(优秀的持久层框架) MyBatis的写法 开发规范: 单元测试的写法 传递参数 他的意思是说spring相关只打印INFO级别的标准,但是他也能获取到debug级别的日志 日志设置颜色(只能控制控制

    2024年02月04日
    浏览(37)
  • Springboot应用中Mybatis输出SQL日志的三种方法

    目录 一、方法一:指定mybatis日志级别 二、方法二:配置mybatis-config.xml 三、方法三:指定整个mapper包下的日志级别

    2024年01月20日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包