日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jpa 自定义sql if_mybatis仿jpa 使用@createDate @updateDate 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在使用mybatis的時候發現一個問題,就是好多的時候保存實體的時候,都要set create 和update,這樣很麻煩,有沒有可能類似jap 使用注解自動生成。jpa 的注解原理也攔截sql ,把sql 里面的參數綁定給修改一下。?

了解了原理,我們也就自己可以可以自己仿照jpa 實現一下了。

先自定義兩個注解@createDate,@updateDate

項目原理,使用mybatis?的攔截器,攔截Executor,的update?方法,

里面?兩個參數

根據MappedStatement 獲取sql 的注解枚舉類型, Object 是入參,?在根據入參 object 獲取屬性列表,看屬性上面是否存在?自定義的注解,不同的注解使用場合不同,在用反射給filed set值。?

看一下代碼

自定義攔截器

@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) { }}

實體:

現在把?

這個插件加入mybatis 的配置中。

一般情況下我們是這樣配置的

但是這樣是有問題的,我們啟動看一下

類型轉換錯誤,這是因為他要的是類mybatis.configuration.interceptors 不是字符串,?

我們看一下mybatis 官網

我們只要聲明他是一個bean會自動注入的。

我們來寫一個測試類

啟動項目運行一下,別忘記了

打印sql?

啟動調用一下接口?

creatdate 和updatedate 沒有值,?在把實體的注解加上

再跑一下

成功了,喜歡,點贊,轉發。

總結

以上是生活随笔為你收集整理的jpa 自定义sql if_mybatis仿jpa 使用@createDate @updateDate的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。