byte-buddy实现mybatis-plus动态mapper
2023-02-25 18:16:27 时间
掌握了教育,就掌握了国家——法国谚语
构造动态mapper
部分代码如下:
public static void buildMapper(Configuration configuration, Class<?> entityClass) {
if (!(configuration instanceof MybatisConfiguration)) {
throw new IllegalArgumentException("configuration must be MybatisConfiguration");
}
ENTITY_MAPPER_CLASS_CACHE.computeIfAbsent(entityClass, k -> {
Class<?> dynamicMapper = new ByteBuddy()
.makeInterface(TypeDescription.Generic.Builder.parameterizedType(IMapper.class, entityClass).build())
.name(String.format("io.github.vampireachao.mapper.%sMapper", entityClass.getSimpleName()))
.make()
.load(ClassUtils.class.getClassLoader())
.getLoaded();
configuration.addMapper(dynamicMapper);
return dynamicMapper;
});
}
这里是放到一个map
里,获取的地方如下:
public static <T> Class<?> getMapperClass(Class<T> clazz) {
if (clazz == null || clazz.isPrimitive() || SimpleTypeRegistry.isSimpleType(clazz) || clazz.isInterface()) {
throw ExceptionUtils.mpe("找不到指定的class!请仅在明确确定会有 class 的时候,调用该方法");
}
Class<?> targetClass = ClassUtils.getUserClass(clazz);
Class<?> mapperClass = ENTITY_MAPPER_CLASS_CACHE.get(targetClass);
if (null != mapperClass) {
return mapperClass;
}
Class<?> currentClass = clazz;
while (null == mapperClass && Object.class != currentClass) {
currentClass = currentClass.getSuperclass();
mapperClass = ENTITY_MAPPER_CLASS_CACHE.get(ClassUtils.getUserClass(currentClass));
}
if (mapperClass == null) {
mapperClass = ClassUtils.toClassConfident(getTableInfo(clazz).getCurrentNamespace());
}
if (mapperClass != null) {
ENTITY_MAPPER_CLASS_CACHE.put(targetClass, mapperClass);
}
return mapperClass;
}
使用:
@Test
void testBuildMapper() {
UserInfo userInfo = new UserInfo() {{
setId(1L);
setName("Jone");
}};
Configuration configuration = TableInfoHelper.getTableInfo(UserInfo.class).getConfiguration();
Database.buildMapper(configuration, UserInfo.class);
TableInfo tableInfo = TableInfoHelper.getTableInfo(userInfo.getClass());
Assertions.assertNotNull(tableInfo);
Assertions.assertFalse(Database.list(userInfo.getClass()).isEmpty());
}
相关文章
- 使用 DeepSpeech 在你的应用中实现语音转文字
- 多变量逻辑表达式化简原理与应用:卡诺图化简法
- 5G 商用第三年:无人驾驶的“上山”与“下海”
- TVP 尖峰对话:透过喧嚣探寻低代码的技术本我
- 5G赋能行业应用,助推数智化转型!
- 关于微信小游戏代码授权的理解
- 京东金融客户端用户触达方式的精细化探索与实践
- 微服务vs单体,为什么说单体在绝大部分时候是更好的选择
- 微服务架构:微服务究竟是灵丹还是毒药呢?
- axios笔记(二) 深入了解axios
- Ios app如何上架
- Iosapp上架流程
- 将WalletConnect集成到Vue.js DApps中
- Ios上架app流程
- 混合多云管理, 实现一体化运营与治理
- 浅谈OpenResty在Web应用防火墙中的应用
- iOS上架流程
- 如何更好的输出应用日志
- 直播回顾 | 这场直播回答了手机银行人机验证的必要性和可行性
- 原创Paper | 在 Android 中开发 eBPF 程序学习总结(一)