From 13e8ac5f854e278c5bce53cc2b0dd39945c3025b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Wed, 26 Aug 2026 09:38:00 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E5=AF=B9mybatis?= =?UTF-8?q?=E6=B8=B8=E6=A0=87=E6=9F=A5=E8=AF=A2=20=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=8A=A0=E8=A7=A3=E5=AF=86=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MybatisDecryptInterceptor.java | 63 +++++++++++++++++-- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java index d9932b0d1..3d1642803 100644 --- a/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java +++ b/ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/interceptor/MybatisDecryptInterceptor.java @@ -1,11 +1,14 @@ package org.dromara.common.encrypt.interceptor; import lombok.AllArgsConstructor; +import org.apache.ibatis.cursor.Cursor; import org.apache.ibatis.executor.resultset.ResultSetHandler; import org.apache.ibatis.plugin.*; import org.dromara.common.encrypt.core.EncryptedFieldProcessor; +import java.io.IOException; import java.sql.Statement; +import java.util.Iterator; import java.util.Properties; /** @@ -13,10 +16,10 @@ import java.util.Properties; * * @author Lion Li */ -@Intercepts({@Signature( - type = ResultSetHandler.class, - method = "handleResultSets", - args = {Statement.class}) +@Intercepts({ + @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class}), + // MP 3.5.17 起 selectOne/selectVoOne 走游标,需一并拦截解密 + @Signature(type = ResultSetHandler.class, method = "handleCursorResultSets", args = {Statement.class}) }) @AllArgsConstructor public class MybatisDecryptInterceptor implements Interceptor { @@ -32,11 +35,13 @@ public class MybatisDecryptInterceptor implements Interceptor { */ @Override public Object intercept(Invocation invocation) throws Throwable { - // 获取执行mysql执行结果 Object result = invocation.proceed(); if (result == null) { return null; } + if (result instanceof Cursor cursor) { + return new DecryptCursor<>(cursor, encryptedFieldProcessor); + } encryptedFieldProcessor.decrypt(result); return result; } @@ -61,4 +66,52 @@ public class MybatisDecryptInterceptor implements Interceptor { public void setProperties(Properties properties) { } + + /** + * 查询结果解密游标,保持 MyBatis 游标的惰性读取语义。 + * + * @param 查询结果类型 + */ + private record DecryptCursor(Cursor delegate, EncryptedFieldProcessor encryptedFieldProcessor) + implements Cursor { + + @Override + public boolean isOpen() { + return delegate.isOpen(); + } + + @Override + public boolean isConsumed() { + return delegate.isConsumed(); + } + + @Override + public int getCurrentIndex() { + return delegate.getCurrentIndex(); + } + + @Override + public Iterator iterator() { + Iterator iterator = delegate.iterator(); + return new Iterator<>() { + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public T next() { + T result = iterator.next(); + encryptedFieldProcessor.decrypt(result); + return result; + } + }; + } + + @Override + public void close() throws IOException { + delegate.close(); + } + } }