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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值