Example usage for org.apache.ibatis.mapping BoundSql getParameterObject

List of usage examples for org.apache.ibatis.mapping BoundSql getParameterObject

Introduction

In this page you can find the example usage for org.apache.ibatis.mapping BoundSql getParameterObject.

Prototype

public Object getParameterObject() 

Source Link

Usage

From source file:org.njqspringboot.support.mybatis.locker.interceptor.OptimisticLocker.java

License:Open Source License

private VersionLocker getVersionLocker(MappedStatement ms, BoundSql boundSql) {

    Class<?>[] paramCls = null;
    Object paramObj = boundSql.getParameterObject();

    /******************?????3?***********************/
    /******************Process param must order by below ***********************/
    // 1??@Param?
    // 1?Process @Param param
    if (paramObj instanceof MapperMethod.ParamMap<?>) {
        MapperMethod.ParamMap<?> mmp = (MapperMethod.ParamMap<?>) paramObj;
        if (null != mmp && !mmp.isEmpty()) {
            paramCls = new Class<?>[mmp.size() / 2];
            int mmpLen = mmp.size() / 2;
            for (int i = 0; i < mmpLen; i++) {
                Object index = mmp.get("param" + (i + 1));
                paramCls[i] = index.getClass();
            }// www. j a  v  a  2  s.  c  o m
        }

        // 2??Map?
        // 2?Process Map param
    } else if (paramObj instanceof Map) {
        paramCls = new Class<?>[] { Map.class };

        // 3??POJO?
        // 3?Process POJO entity param
    } else {
        paramCls = new Class<?>[] { paramObj.getClass() };
    }

    String id = ms.getId();
    Cache.MethodSignature vm = new MethodSignature(id, paramCls);
    VersionLocker versionLocker = versionLockerCache.getVersionLocker(vm);
    if (null != versionLocker) {
        return versionLocker;
    }

    // synchronized???
    // Here remove synchronized keyword or ReentrantLock, because it's a idempotent operation
    if (null == mapperMap || mapperMap.isEmpty()) {
        mapperMap = new HashMap<>();
        Collection<Class<?>> mappers = ms.getConfiguration().getMapperRegistry().getMappers();
        if (null != mappers && !mappers.isEmpty()) {
            for (Class<?> me : mappers) {
                mapperMap.put(me.getName(), me);
            }
        }
    }

    int pos = id.lastIndexOf(".");
    String nameSpace = id.substring(0, pos);
    if (mapperMap.containsKey(nameSpace)) {
        Class<?> mapper = mapperMap.get(nameSpace);
        Method m;
        try {
            m = mapper.getMethod(id.substring(pos + 1), paramCls);
        } catch (NoSuchMethodException | SecurityException e) {
            throw new RuntimeException("The Map type param error." + e, e);
        }
        versionLocker = m.getAnnotation(VersionLocker.class);
        if (null == versionLocker) {
            versionLocker = trueLocker;
        }
        if (!versionLockerCache.containMethodSignature(vm)) {
            versionLockerCache.cacheMethod(vm, versionLocker);
        }
        return versionLocker;
    } else {
        throw new RuntimeException("Config info error, maybe you have not config the Mapper interface");
    }
}