jpa 自定义sql if_mybatis仿jpa 使用@createDate @updateDate

最近在使用mybatis的时候发现一个问题,就是好多的时候保存实体的时候,都要set create 和update,这样很麻烦,有没有可能类似jap 使用注解自动生成。jpa 的注解原理也拦截sql ,把sql 里面的参数绑定给修改一下。 

了解了原理,我们也就自己可以可以自己仿照jpa 实现一下了。

先自定义两个注解@createDate,@updateDate

项目原理,使用mybatis 的拦截器,拦截Executor,的update 方法,

里面 两个参数

7c7bc05fad08b55e3bda76e2f4de76e4.png

根据MappedStatement 获取sql 的注解枚举类型, Object 是入参, 在根据入参 object 获取属性列表,看属性上面是否存在 自定义的注解,不同的注解使用场合不同,在用反射给filed set值。 

看一下代码

6efcb1981fc46efd903700f283c87b51.png

d299b573abbf339a2d97e7859a907de8.png

自定义拦截器

@Intercepts({        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),})public class DatePlugin implements Interceptor {    @Override    public Object intercept(Invocation invocation) throws Exception {        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];        // 获取 SQL 命令        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();        // 获取参数        Object parameter = invocation.getArgs()[1];        List parameterMappings = mappedStatement.getParameterMap().getParameterMappings();        // 获取私有成员变量        Field[] declaredFields = parameter.getClass().getDeclaredFields();        // 插入要修改两个值        for (Field field : declaredFields) {            if (SqlCommandType.INSERT.equals(sqlCommandType)) {                if (!ObjectUtils.isEmpty(field.getAnnotation(CreateDate.class))) {                    field.setAccessible(true);                    field.set(parameter, new Timestamp(System.currentTimeMillis()));                }               if (!ObjectUtils.isEmpty(field.getAnnotation(UpdateDate.class))) {                    field.setAccessible(true);                    field.set(parameter, new Timestamp(System.currentTimeMillis()));                }            }            // update 只要修改一个值            if (SqlCommandType.UPDATE.equals(sqlCommandType)) {                if (!ObjectUtils.isEmpty(field.getAnnotation(UpdateDate.class))) {                    field.setAccessible(true);                    field.set(parameter,  new Timestamp(System.currentTimeMillis()));                }            }        }        return invocation.proceed();    }    @Override    public Object plugin(Object target) {        return Plugin.wrap(target, this);    }    @Override    public void setProperties(Properties properties) {    }}

实体:

324400568ea829a6707f552fe8bc8a46.png

现在把 

这个插件加入mybatis 的配置中。

一般情况下我们是这样配置的

ac1679986709cadeca9ed66817c86516.png

但是这样是有问题的,我们启动看一下

ecc14a00f59c546f8c6b8cfa6192fac3.png

类型转换错误,这是因为他要的是类mybatis.configuration.interceptors 不是字符串, 

我们看一下mybatis 官网

e69a02d1770c9afb6abb911b8a0aa97b.png

我们只要声明他是一个bean会自动注入的。

我们来写一个测试类

efaa882d912a210e6ee2736519bef685.png

启动项目运行一下,别忘记了

9aa238e6a30adf074dc93202e239a127.png

打印sql 

启动调用一下接口 

4184d38f28124dccf7a66499c6afd3b2.png

creatdate 和updatedate 没有值, 在把实体的注解加上

75f49f8414fc7c1150692e228f85cf27.png

再跑一下

2034f79c51fb1cd975cf7bd05f0856c9.png

成功了,喜欢,点赞,转发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统每月定时重启,linux系统定时重启.doc

linux系统定时重启linux系统定时重启--------------------每个月1号凌晨3点自动重启步骤如下:1、用root帐号登陆;2、打开终端窗口;3、输入"crontab -e"4、按Insert键。5、输入"0 3 1 * * reboot"6、按esc键。7、输入&quo…

卡牌大师怎么玩_用卡牌大师如何上分

联盟界流传一句话,如果只玩一个英雄。德玛可以上白金,瑞文可以上砖石,而卡牌可以上王者。所以说玩好卡牌是可以快速上分的,卡牌拥有稳定的控制,AOE伤害,大招的快速支援,可以说是英雄里近乎完美的…

直线电机原理动画_最新的3D动画演示:同步电机原理及技术,一般人看不懂

据说每台交流电机都使用旋转磁场,这项发明掀起了工业革命。分享一下LearnEngineering最新制作的一个动画,讲解的是同步电机RMF的工作原理和技术发展:同步电动的工作原理是:RMF旋转磁场相互作用。恒速特性是通过恒定磁场和旋转磁场…

l2的最优回归_大白话5分钟带你走进人工智能-第15节L1,L2几何解释和Ridge等回归...

第15节 L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归上一节中我们讲解了L1和L2正则的概念,知道了L1和L2都会使不重要的维度权重下降得多,重要的维度权重下降得少,引入L1正则会使不重要的w趋于0(达到稀疏编码的目的…

用python绘制图形_python绘制图形

1 2 File Name: draw3 Author: tim4 Date: 2018/8/15 16:475 Description: 图形绘制。十分有用,对于工作中实验性的项目,可以快速展示效果。如果使用java,还需要配合前端展示。6 7 8 importma…

linux中管道的概念,浅谈Linux管道

管道(pipe)是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。管道是UNIX环境中历史最悠久的进程间通信方式,从本质上说,管道也是一种文件,也是遵循UNIX的“一切皆文件”的原则设计的。虽然实现形态上是文件,但是管道…

ttl接地是高电平还是低电平_说明图3.12中各门电路的输出是高电平还是低电平。已知它们都是74HC系列的CMOS电路 简单的逻辑门电路 判断各门电路...

1、高电平,有关。2、低电平。3、输入端接电源,悬空或高阻(10k以上)相当于接高电平,接地为低电平,通过低阻接入电平信号则认为输入信号与接入电平相同。则为OC门。图中的第一个输入为高电平,电路为与非门,则…

linux redis安装报错,Linux安装Redis实现过程及报错解决方案

今天安装redis出现些之前安装不曾出现错误,一并在此做个记录一、安装redis及出现错误首先下载redis,官方下载地址页面:https://redis.io/download我们这里选择稳定版6.0.1版本正常安装步骤如下:[rootlocalhost ~]# yum install gc…

python 工资管理软件_4_python之路之模拟工资管理系统

#!/usr/bin/env python#_*_ coding: utf-8 _*_#author:chenjianwen#email:1071179133qq.com importsys,os##定义操作列表 ops [查询员工工资,修改员工工资,增加新员工记录,退出] info{}defget_info():##读取文件得到员工信息 globalinfo with open(info…

dateformat 返回类型_SpringBoot返回date日期格式化

SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差问题描述在Spring Boot项目中,使用RestController注解,返回的java对象中若含有date类型的属性,则默认输出为TIMESTAMP时间戳格式(数据库datetime类型查询…

linux gcc中sin30度,学习gcc.pdf

学习gcc如何在 Ubuntu 下安装和使用 gccGCC 是在Linux 系统中用的比较多的编译器,一般做Linux 开发的朋友都会用 GCC 编译器,但今天在 Ubuntu 上安装 GCC 时出现了问题,于是上网查询如何在Ubuntu 上安装 GCC,答案如下:…

python链表中删除一个节点数据_python实现单链表中删除倒数第K个节点的方法

本文实例为大家分享了python实现单链表中删除倒数第K个节点的具体代码,供大家参考,具体内容如下 题目: 给定一个链表,删除其中倒数第k个节点。 代码: class LinkedListAlgorithms(object): def __init__(self): pass d…

工业机器人工具中心点标定的意义_一种利用平面标定板的机器人工具中心点标定方法_2015108676182_说明书_专利查询_专利网_钻瓜专利网...

技术领域本发明涉及机器人工具中心点(Toolcenterpoint,TCP)标定方法,尤其涉及一种利用平面标定板的机器人工具中心点标定方法。背景技术机器人工具中心点(Toolcenterpoint,TCP)是与机器人工具固连的工具坐标系的原点,工具实际工作点在工具坐标系中的坐标…

自动感光调节LED灯亮度C语言程序,单片机PWM调节LED灯亮度

刚搞完飞思卡尔智能车,昨天我一起做车的搭档跑来跟我说魏老师(我们系的前主任,不知道他们怎么认识的....)叫他帮忙做个可通过无线遥控调节LED灯亮度的设计方案,问我有没有兴趣做做,主要是魏老师也是受他以前的老同学(合工大的....…

python找到字符中空格所在的位置_Python 查找字符在字符串中的位置示例效果

Python 查找字符在字符串中的位置实例 下面为大家分享一篇Python 查找字符在字符串中的位置实例,具有很好的参考价值,希望对大家有所帮助。一起过来看看吧 str_1wo shi yi zhi da da niu char_1i nPosstr_1.index(char_1) print(nPos) 运行结果&#xf…

ztree 自定义参数_Ztree节点前加上两个自定义按钮

前言:在我的权限管理模块遇到了给某些角色加权限的问题,这时就需要实现将每个模块做成树,在每个节点前加上预览和编辑的按钮,这样可以根据数据库的某个字段给每个角色赋权限。必须必须吐槽的是,这部分的功能在网上没找…

xilinx c语言编程,使用Xilinx SDSoc在Xilinx zcu102开发板上编程HelloWorld

关于Xilinx SDSoc的介绍我就不再复述了,我理解的也不一定准确,可以阅读官方文档了解SDSoc,你可以把它理解为一个集成开发环境 (IDE),通过SDSoc我们能够简单快速的对Xilinx的开发板进行编程,不用像传统的嵌入式编程那样…

python画图小猪佩奇_吊炸天!Python 20秒画出小猪佩奇

原标题:吊炸天!Python 20秒画出小猪佩奇 今年社交平台上的带货女王是谁?范冰冰?杨幂?Angelababy?不,是猪猪女孩小猪佩奇。 小猪佩奇在构图基本是各种曲线,类抛物线、类圆、类椭圆、类二次贝塞尔曲线。因为画图画曲线不是Pytho…

win10c语言错误,win10打开程序提示错误状态0xc0000020的原因和解决方法

win10系统打开程序弹出“c:\xx\xxx.dll没有被指定在windows上运行,或者它包含错误。请尝试使用原始安装介质重新安装程序,或联系你的系统管理员或软件供应商以获取支持。错误状态0xc0000020 ”的提示,这到底是什么情况?这 一般是由…

poll和死锁_计算机基础知识

转自:http://blog.csdn.net/qq_15437629/article/details/52388685在这里只做备份计算机网络TCP/IP模型TCP/IP协议集的分层实施:为什么要给网络划分层次?(1)各层之间相对独立,每层都可以用最合适的技术实现;(2)各层只需知道通过层…