diff --git a/mybatis-plus-join-solon-plugin/pom.xml b/mybatis-plus-join-solon-plugin/pom.xml new file mode 100644 index 0000000..5fd1732 --- /dev/null +++ b/mybatis-plus-join-solon-plugin/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + com.github.yulichang + mybatis-plus-join-root + ${revision} + + + mybatis-plus-join-solon-plugin + + + 2.6.3 + 8 + 8 + UTF-8 + + + + + com.github.yulichang + mybatis-plus-join-extension + ${revision} + + + com.baomidou + mybatis-plus-core + ${mpj.mybatis.plus.version} + provided + + + org.noear + solon + ${solon.varrsion} + provided + + + org.noear + mybatis-solon-plugin + ${solon.varrsion} + provided + + + org.noear + mybatis-plus-solon-plugin + ${solon.varrsion} + provided + + + + \ No newline at end of file diff --git a/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java new file mode 100644 index 0000000..b6ab44f --- /dev/null +++ b/mybatis-plus-join-solon-plugin/src/main/java/com/github/yulichang/mybatisplusjoin/solon/plugin/XPluginImpl.java @@ -0,0 +1,91 @@ +package com.github.yulichang.mybatisplusjoin.solon.plugin; + +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; +import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils; +import com.github.yulichang.config.ConfigProperties; +import com.github.yulichang.config.MPJInterceptorConfig; +import com.github.yulichang.config.enums.IfAbsentEnum; +import com.github.yulichang.config.enums.LogicDelTypeEnum; +import com.github.yulichang.extension.mapping.config.MappingConfig; +import com.github.yulichang.injector.MPJSqlInjector; +import com.github.yulichang.toolkit.SpringContentUtils; +import com.github.yulichang.toolkit.reflect.GenericTypeUtils; +import com.github.yulichang.wrapper.enums.IfAbsentSqlKeyWordEnum; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.solon.MybatisAdapter; +import org.apache.ibatis.solon.integration.MybatisAdapterManager; +import org.noear.solon.core.AppContext; +import org.noear.solon.core.Plugin; +import org.noear.solon.core.Props; +import org.noear.solon.core.event.AppLoadEndEvent; +import org.noear.solon.core.util.GenericUtil; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiPredicate; +import java.util.stream.Collectors; + +public class XPluginImpl implements Plugin { + + @Override + public void start(AppContext context) throws Throwable { + /* 设置 MPJSqlInjector + 反射修改GlobalConfigUtils.GLOBAL_CONFIG属性 + 修改final修饰的变量会出现警告 + 使用solon方式配置不生效采用的“曲线救国”方式 + issue https://gitee.com/noear/solon/issues/I8SJ0Z */ + Field field = GlobalConfigUtils.class.getDeclaredField("GLOBAL_CONFIG"); + field.setAccessible(true); + Field modifier = Field.class.getDeclaredField("modifiers"); + modifier.setAccessible(true); + modifier.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, new ConcurrentHashMap() { + @Override + @SuppressWarnings("NullableProblems") + public GlobalConfig putIfAbsent(String key, GlobalConfig value) { + value.setSqlInjector(new MPJSqlInjector()); + return super.putIfAbsent(key, value); + } + }); + GenericTypeUtils.setGenericTypeResolver(GenericUtil::resolveTypeArguments); + // SpringContext兼容 + SpringContentUtils.setSpringContext(new SpringContentUtils.SpringContext() { + @Override + public T getBean(Class clazz) { + return context.getBean(clazz); + } + + @Override + public Map getBeansOfType(Class clazz) { + return context.getBeansMapOfType(clazz); + } + }); + // 读取配置 + Props prop = context.cfg().getProp("mybatis-plus-join"); + ConfigProperties.banner = prop.getBool("banner", ConfigProperties.banner); + ConfigProperties.subTableLogic = prop.getBool("subTableLogic", ConfigProperties.subTableLogic); + ConfigProperties.msCache = prop.getBool("msCache", ConfigProperties.msCache); + ConfigProperties.tableAlias = prop.get("tableAlias", ConfigProperties.tableAlias); + ConfigProperties.joinPrefix = prop.get("joinPrefix", ConfigProperties.joinPrefix); + ConfigProperties.logicDelType = prop.getOrDefault("logicDelType", ConfigProperties.logicDelType, val -> + Arrays.stream(LogicDelTypeEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() + .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.logicDelType 配置错误"))); + ConfigProperties.mappingMaxCount = prop.getInt("mappingMaxCount", ConfigProperties.mappingMaxCount); + ConfigProperties.ifAbsent = prop.getOrDefault("ifAbsent", ConfigProperties.ifAbsent, val -> + Arrays.stream(IfAbsentEnum.values()).filter(e -> e.name().equalsIgnoreCase(val)).findFirst() + .map(m -> (BiPredicate) (o, ifAbsentSqlKeyWordEnum) -> m.test(o)) + .orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.ifAbsent 配置错误"))); + // 后续操作 + context.onEvent(AppLoadEndEvent.class, e -> { + List sqlSessionFactoryList = MybatisAdapterManager.getAll().values().stream() + .map(MybatisAdapter::getFactory).collect(Collectors.toList()); + new MPJInterceptorConfig(sqlSessionFactoryList, false); + MappingConfig.init(); + }); + } +} \ No newline at end of file diff --git a/mybatis-plus-join-solon-plugin/src/main/resources/META-INF/solon/mybatis-plus-join-solon-plugin.properties b/mybatis-plus-join-solon-plugin/src/main/resources/META-INF/solon/mybatis-plus-join-solon-plugin.properties new file mode 100644 index 0000000..ce4223a --- /dev/null +++ b/mybatis-plus-join-solon-plugin/src/main/resources/META-INF/solon/mybatis-plus-join-solon-plugin.properties @@ -0,0 +1,3 @@ +# suppress inspection "UnusedProperty" for whole file +solon.plugin=com.github.yulichang.mybatisplusjoin.solon.plugin.XPluginImpl +solon.plugin.priority=3 \ No newline at end of file diff --git a/pom.xml b/pom.xml index e54380e..4808b33 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ mybatis-plus-join-core mybatis-plus-join-annotation mybatis-plus-join-extension + mybatis-plus-join-solon-plugin mybatis-plus-join-test