All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.mybatisboost.json.JsonResultSetsHandler Maven / Gradle / Ivy

The newest version!
package cn.mybatisboost.json;

import cn.mybatisboost.util.ReflectionUtils;
import cn.mybatisboost.util.function.UncheckedFunction;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;

import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

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

    private ConcurrentMap fieldCache = new ConcurrentHashMap<>();

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        try {
            List proceed = (List) invocation.proceed();
            List properties = JsonTypeHandler.tlProperties.get();
            if (proceed.isEmpty() || properties.isEmpty()) return proceed;

            Class type = proceed.get(0).getClass();
            List results = JsonTypeHandler.tlResults.get();
            for (int i = 0; i < results.size(); i++) {
                String content = results.get(i);
                if (content != null) {
                    Field field = fieldCache.computeIfAbsent(properties.get(i % properties.size()),
                            UncheckedFunction.of(key -> ReflectionUtils.makeAccessible(type.getDeclaredField(key))));
                    field.set(proceed.get(i / properties.size()), JsonTypeHandler.objectMapper.readValue(content,
                                    JsonTypeHandler.objectMapper.constructType(field.getGenericType())));
                }
            }
            return proceed;
        } finally {
            JsonTypeHandler.tlProperties.remove();
            JsonTypeHandler.tlResults.remove();
        }
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy