mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-08 01:28:24 +08:00
style: 优化 Mappers 类。
This commit is contained in:
parent
2e7c271b7d
commit
d2ce08e9e9
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user