style: 优化 Mappers 类。

This commit is contained in:
Suomm 2023-08-21 09:10:53 +08:00
parent 2e7c271b7d
commit d2ce08e9e9

View File

@ -30,60 +30,73 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* 获取 {@link BaseMapper} 对象
*
* @author michael * @author michael
* @author 王帅
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class Mappers { public class Mappers {
private static final Map<Class<?>, Class<?>> ENTITY_MAPPER_MAP = new ConcurrentHashMap<>(); private Mappers() {
}
private static final Map<Class<?>, Object> MAPPER_OBJECTS = new ConcurrentHashMap<>(); private static final Map<Class<?>, Object> MAPPER_OBJECTS = new ConcurrentHashMap<>();
private static final Map<Class<?>, Class<?>> ENTITY_MAPPER_MAP = new ConcurrentHashMap<>();
/**
* 添加 实体类 {@link BaseMapper} 接口实现接口 对应两者皆为非动态代理类
*
* @param entityClass 实体类
* @param mapperClass {@link BaseMapper} 实现接口
*/
static void addMapping(Class<?> entityClass, Class<?> mapperClass) { static void addMapping(Class<?> entityClass, Class<?> mapperClass) {
ENTITY_MAPPER_MAP.put(entityClass, mapperClass); ENTITY_MAPPER_MAP.put(entityClass, mapperClass);
} }
/** /**
* 通过 entity Class 获取 Mapper 对象 * 通过 实体类 获取对应 {@link BaseMapper} 对象
* *
* @param entityClass * @param entityClass 实体类
* @param <Entity> * @param <E> 实体类类型
* @return mapper 对象 * @return {@link BaseMapper} 对象
*/ */
public static <Entity> BaseMapper<Entity> ofEntityClass(Class<Entity> entityClass) { public static <E> BaseMapper<E> ofEntityClass(Class<E> entityClass) {
Class<?> mapperClass = ENTITY_MAPPER_MAP.get(entityClass); Class<?> mapperClass = ENTITY_MAPPER_MAP.get(entityClass);
if (mapperClass == null) { if (mapperClass == null) {
throw FlexExceptions.wrap("Can not find MapperClass by entity: " + entityClass.getName()); throw FlexExceptions.wrap("Can not find MapperClass by entity: " + entityClass.getName());
} }
return (BaseMapper<Entity>) ofMapperClass(mapperClass); return (BaseMapper<E>) ofMapperClass(mapperClass);
} }
/** /**
* 通过 mapperClass 直接获取 mapper 对象执行 * 通过 {@link BaseMapper} 接口实现的 Class 引用直接获取 {@link BaseMapper} 代理对象
* *
* @param mapperClass * @param mapperClass {@link BaseMapper} 接口实现
* @return mapperObject * @return {@link BaseMapper} 对象
*/ */
public static <Mapper> Mapper ofMapperClass(Class<Mapper> mapperClass) { public static <M> M ofMapperClass(Class<M> mapperClass) {
Object mapperObject = MapUtil.computeIfAbsent(MAPPER_OBJECTS, mapperClass, clazz -> Object mapperObject = MapUtil.computeIfAbsent(MAPPER_OBJECTS, mapperClass, clazz ->
Proxy.newProxyInstance(mapperClass.getClassLoader() Proxy.newProxyInstance(mapperClass.getClassLoader()
, new Class[]{mapperClass} , new Class[]{mapperClass}
, new MapperHandler(mapperClass))); , new MapperHandler(mapperClass)));
return (Mapper) mapperObject; return (M) mapperObject;
} }
private static class MapperHandler implements InvocationHandler {
static class MapperHandler implements InvocationHandler { private final Class<?> mapperClass;
private final ExecutorType executorType;
private Class<?> mapperClass; private final SqlSessionFactory sqlSessionFactory;
private final SqlSessionFactory sqlSessionFactory = FlexGlobalConfig.getDefaultConfig().getSqlSessionFactory();
private final ExecutorType executorType = FlexGlobalConfig.getDefaultConfig().getConfiguration().getDefaultExecutorType();
public MapperHandler(Class<?> mapperClass) { public MapperHandler(Class<?> mapperClass) {
this.mapperClass = mapperClass; this.mapperClass = mapperClass;
this.executorType = FlexGlobalConfig.getDefaultConfig()
.getConfiguration()
.getDefaultExecutorType();
this.sqlSessionFactory = FlexGlobalConfig.getDefaultConfig()
.getSqlSessionFactory();
} }
private SqlSession openSession() { private SqlSession openSession() {
@ -97,6 +110,7 @@ public class Mappers {
return method.invoke(mapper, args); return method.invoke(mapper, args);
} }
} }
} }
} }