solon-plugin

This commit is contained in:
yulichang 2023-12-30 14:30:37 +08:00
parent 63e5c3787e
commit e021c8281b
4 changed files with 148 additions and 0 deletions

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join-root</artifactId>
<version>${revision}</version>
</parent>
<artifactId>mybatis-plus-join-solon-plugin</artifactId>
<properties>
<solon.varrsion>2.6.3</solon.varrsion>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join-extension</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>${mpj.mybatis.plus.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon</artifactId>
<version>${solon.varrsion}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>mybatis-solon-plugin</artifactId>
<version>${solon.varrsion}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>mybatis-plus-solon-plugin</artifactId>
<version>${solon.varrsion}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -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<String, GlobalConfig>() {
@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> T getBean(Class<T> clazz) {
return context.getBean(clazz);
}
@Override
public <T> Map<String, T> getBeansOfType(Class<T> 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<Object, IfAbsentSqlKeyWordEnum>) (o, ifAbsentSqlKeyWordEnum) -> m.test(o))
.orElseThrow(() -> ExceptionUtils.mpe("mybatis-plus-join.ifAbsent 配置错误")));
// 后续操作
context.onEvent(AppLoadEndEvent.class, e -> {
List<SqlSessionFactory> sqlSessionFactoryList = MybatisAdapterManager.getAll().values().stream()
.map(MybatisAdapter::getFactory).collect(Collectors.toList());
new MPJInterceptorConfig(sqlSessionFactoryList, false);
MappingConfig.init();
});
}
}

View File

@ -0,0 +1,3 @@
# suppress inspection "UnusedProperty" for whole file
solon.plugin=com.github.yulichang.mybatisplusjoin.solon.plugin.XPluginImpl
solon.plugin.priority=3

View File

@ -35,6 +35,7 @@
<module>mybatis-plus-join-core</module>
<module>mybatis-plus-join-annotation</module>
<module>mybatis-plus-join-extension</module>
<module>mybatis-plus-join-solon-plugin</module>
<module>mybatis-plus-join-test</module>
</modules>