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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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 ”的提示,这到底是什么情况?这 一般是由…

matlab 向量_Matlab基础入门

感谢大家观看你所做的事情,也行暂时看不到成功,但不要灰心,你并不是没有成长,而是在扎根.前情提要本篇文章将会分多次发放(原因内容太长,导致写的是否微信卡崩了🙃), 目的在于从基础的Matlab的教程开始慢慢的深入. 如果大家看到该文章有些格式上的错误或内容上的错误…

python环境配置opencv_【Python】python2.7 安装配置OpenCV2

原博文 2017-05-23 22:28 − 环境:Ubuntu16.04 anaconda Python2.7 opencv2.4.13 安装opencv后 import cv2 遇到错误信息: No module named cv2 安装opencv时make的过程中会出现文件“cv2.so”,它是连接OpenCV和... 相关推荐 2019-12-04 13:5…

流水灯c语言程序延时失败,用c8051f340做控制流水灯实验,程序会卡死在延时函数中 ,只要在那加延时函数程序就只能跑到那,代码如下...

满意答案lohboon2016.07.31采纳率:52% 等级:7已帮助:1159人#include "reg52.h"#define uint unsigned int#define uchar unsigned charsbit K1 P3^2; //独立按键void Delayms(uint x){ uint i,j; for(ix;i>0;i--) for(j100;…

android自定义view生命周期,android基础之自定义view

一、Custom View1、view的继承关系view继承关系.png2、Android 如何绘制试图层次当activity获取焦点时,它必须提供layout层次的根节点,然后android 系统开始视图的绘制过程。绘制是从layout的根节点开始的,按照从上往下的顺序,父元…

python import如何使用_Python如何import其它.py文件及其函数

​ 如上图所示,我想在test_1.py文件中import我在lstm_1.py中定义的LstmParam和 LstmNetwork。我直接采用的是最简单的引用方法:from lstm_1 import LstmParam, LstmNetwork,但是很明显报错了,不能直接这样引用。因为,编…

艾为数字ic面试题_每日学习:数字后端面试100问(2019全新版)

关注并标星大同学吧每天1次,打卡学习积累1个新知识,增1分职场底气作者称谓:Tao涛个人介绍:摸爬滚打多年的数字后端工程师微信公众号:数字后端IC芯片设计半导体知识分享第29期技能升级,从这里开始最近项目刚…

not null primary key什么意思_explain都不会用,你还好意思说精通Mysql查询优化?

Explain简介Explain关键字是Mysql中sql优化的常用「关键字」,通常都会使用Explain来「查看sql的执行计划,而不用执行sql」,从而快速的找出sql的问题所在。在讲解Explain之前首先创建需要的「用户表user、角色表role、以及用户角色关系表role_…

docker always_Ubuntu+Docker+STF环境搭建

Ubuntu提前先安装配置好 Ubuntu server 14.04.5参考资料:Ubuntu 16.04 Server 版安装过程图文详解Dcoker安装Ubuntu 14.04/16.04 (使用apt-get进行安装)安装最新版本# step 1: 安装必要的一些系统工具安装指定版本# 安装指定版本的Docker-CE:安装校验rootubuntu:/ho…

导入obj_3D模型obj文件格式详解

3d打印机导入三维模型通常都是obj格式,下面我们来看一下这种文件的格式。为我们进行产品开发提供技术基础储备。obj格式有4种数据,分别以一下字母开头:v顶点vt纹理坐标vn顶点法向量f 面一、顶点格式:v x y z意义:每个顶…

import java.io 包下载_Go 包管理机制深入分析

前言随着 Go 语言的深入使用,其依赖管理机制也一直是各位 Gopher 热衷于探讨的话题。Go 语言的源码依赖可通过 go get 命令来获取,但自动化程度不高,于是官方提供了 Dep 这样的自动化批量管理依赖的工具。虽然 Go 语言的依赖管理在很多方面还…

android进出动画有白屏,Android启动白屏原因及解决方案

如果大家碰到了这个问题,相信刚开始大家都是很委屈的吧,心里想:我什么都没干啊,就写了个setContentView就要背锅了?如果已经遇到了,不要方,这里给大家提供几个解决方案,我们APP在启动…

jenkins 插件目录_三十二张图告诉你如何用Jenkins构建SpringBoot

目录前言如何安装Jenkins?环境准备开始安装Jenkins初始化配置访问首页输入管理员密码安装插件创建管理员实例配置配置完成构建Spring Boot 项目配置JDK、maven、Git环境安装插件添加 SSH Server添加凭据新建Maven项目构建任务如何构建托管在GitLab的项目&#xff1f…

filter过滤后重新添加_每天记一个单词(第3518)filter

filter /ˈfɪltər/ n. 过滤器;点击音频收听跟读 ↓↓↓↓↓↓(中慢速带读)(音频不显示请关闭头条app后台重新打开或者更新最新版本)英英解释:something that you pass water, air etc through in order to remove unwanted substances and make it clean or suita…

openwrt dhcp 无法获取ip_如何安装Openwrt软路由系统并配置正常使用

本篇文章教大家如何安装Openwrt软路由系统并配置正常使用。首先我们需要能用来当作软路由的主板,主板要至少需要2个千兆网口,一个用作Wan,其他用作Lan.我这边用到的是ASUS-N3050I-CM-A,这块主板拥有两个千兆网口,搭载了功耗仅6w的n3050 CPU,非…