List of usage examples for org.apache.ibatis.mapping BoundSql getParameterObject
public Object getParameterObject()
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"); } }