解决MyBatis查询oracle的NCLOB类型都是内存地址字符串

在项目的配置类文件夹中放入如下通用类OracleResultSetInterceptor

java 复制代码
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;

import java.io.IOException;
import java.io.Reader;
import java.io.StringWriter;
import java.sql.NClob;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

@Intercepts({
    @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = { Statement.class })
})
public class OracleResultSetInterceptor implements Interceptor {

    /**
     * 用于设置拦截器的属性
     * 在这里可以根据需要设置拦截器的具体配置,例如通过配置文件传递一些参数或者初始化一些资源
     * @param properties
     */
    @Override
    public void setProperties(Properties properties) {
    }

    /**
     * 包装目标对象,返回一个代理对象
     * @param target 目标对象
     * @return 代理对象
     */
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    /**
     * 代理对象处理逻辑
     * @param invocation 包含参数,结果集
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object result = invocation.proceed(); // 执行原始方法获取结果
        if (result instanceof Map) {
            Map<String, Object> resultMap = (Map<String, Object>) result;
            processMap(resultMap);
        }else if(result instanceof List){
            List<Object> list=(List<Object>)result;
            for (Object line:list){
                if(line instanceof Map){
                    processMap((Map<String,Object>)line);
                }
            }
        }
        return result;
    }

    /**
     * 处理map
     * @param line
     * @throws SQLException
     * @throws IOException
     */
    private void processMap(Map<String,Object> line) throws SQLException, IOException {
        for (String key:line.keySet()){
            Object value = line.get(key);
            if (value instanceof NClob) {
                NClob nclob = (NClob) value;
                String nclobString = convertNClobToString(nclob);
                line.put(key, nclobString);
            }
        }
    }

    private String convertNClobToString(NClob nclob) throws SQLException, IOException {
        // 将 NCLOB 数据读取为字符串
        Reader reader = nclob.getCharacterStream();
        StringWriter writer = new StringWriter();
        char[] buffer = new char[1024];
        int bytesRead;
        while ((bytesRead = reader.read(buffer)) != -1) {
            writer.write(buffer, 0, bytesRead);
        }
        return writer.toString();
    }


}

配置文件启用mybatis自定义插件

java 复制代码
mybatis:
  configuration:
    plugins:
      - interceptor: your.package.CustomResultSetInterceptor
java 复制代码
<configuration>
    <plugins>
        <plugin interceptor="your.package.CustomResultSetInterceptor"/>
    </plugins>
</configuration>
相关推荐
weelinking2 小时前
【产品】12_接入数据库——让数据永久保存
jvm·数据库·python·react.js·数据挖掘·前端框架·产品经理
稳联技术老娜2 小时前
DeviceNet主站怎么连接西门子PLC,Profinet网关配置手册(那智机器人)
服务器·网络·数据库
这个DBA有点耶3 小时前
云上运维新挑战:当数据库不再“看得见摸得着”
数据库·sql·程序人生·云原生·运维开发·学习方法·dba
AskHarries4 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
消失在人海中4 小时前
oracle 数据库多表关联查询
服务器·数据库·oracle
九皇叔叔4 小时前
PostgreSQL/openGauss pg_stats 视图从入门到精通:统计信息、执行计划与慢 SQL 优化实战
数据库·sql·postgresql
南极企鹅5 小时前
MySQL间隙锁&临键锁
数据库·sql·mysql
TDengine (老段)6 小时前
TDengine 压缩编码机制 — 双层压缩架构与类型特化算法
大数据·数据库·物联网·算法·时序数据库·tdengine·涛思数据
苏渡苇7 小时前
Redis 持久化——RDB 快照 vs AOF 日志
数据库·redis·缓存·redis持久化·aof vs rdb
l1t7 小时前
DeepSeek总结的使用 PEG 实现运行时可扩展的 SQL 解析器
数据库·sql