Commit 763729e2 authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.开发间开优化结果统计功能,创建间开优化效果统计表,生成对应代码;
2.修改15天,10天,3天,1天间开优化功能,修改代码结构;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 1ece1094
...@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.config.GlobalConfig; ...@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.config.GlobalConfig;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import xstartup.service.mybatis.XMybatis;
/** /**
* mybatis 配置类 * mybatis 配置类
......
package pps.core.common.mybatis;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
import xstartup.base.XStartup;
import xstartup.base.conf.XConfManager;
import xstartup.base.enums.XEnv;
import xstartup.base.exception.XServiceException;
import xstartup.base.util.XEncryptUtils;
import xstartup.base.util.XStringUtils;
import xstartup.base.util.XUuidUtils;
import xstartup.error.XError;
import xstartup.feature.mybatis.conf.XMybatisConf;
import xstartup.feature.mybatis.interceptor.XMybatisDynamicQueryInterceptor;
import xstartup.feature.mybatis.interceptor.XMybatisUpdateInterceptor;
import xstartup.feature.mybatis.log.XMybatisLogger;
import xstartup.service.mybatis.XMybatisContext;
import xstartup.service.mybatis.tool.MybatisResPool;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.function.Supplier;
/**
* xmybatis
*
* @author ZWT
* @date 2024/11/12
*/
@MapperScan
public class XMybatis implements BeanDefinitionRegistryPostProcessor {
public static final String SNAKE_CASE = "snake-case";
private final static Map<String, XMybatis> jpaMap = new HashMap<>();
private static XMybatis defaultMybatis = null;
private String mapperBasePackages;
private String name;
private String dataSourceHash;
private String sqlSessionTemplateName;
private String sqlSessionFactoryName;
private DataSourceTransactionManager dataSourceTransactionManager;
private SqlSessionFactory sqlSessionFactory;
private SqlSessionTemplate sqlSessionTemplate;
private TransactionTemplate transactionTemplate;
private Class<?> dialectClass = null;
private String transactionManagerKey;
private String[] transactionNames;
private String defaultSharding;
private String defaultDriver;
private String defaultUrl;
private String defaultUser;
private String defaultPassword;
private String defaultDatabaseId;
private String sharding;
private String driver;
private String url;
private String user;
private String password;
private String databaseId;
private String naming;
private DataSource dataSource;
/**
* xmybatis
*
* @param defaultSharding 默认分片
* @param defaultDriver 默认驱动程序
* @param defaultUrl 默认url
* @param defaultUser 默认用户
* @param defaultPassword 默认密码
* @param defaultDatabaseId 默认数据库id
* @param transactionNames 交易名称
*/
private XMybatis(String defaultSharding,
String defaultDriver,
String defaultUrl,
String defaultUser,
String defaultPassword,
String defaultDatabaseId,
String[] transactionNames) {
this(null, defaultSharding, defaultDriver, defaultUrl, defaultUser, defaultPassword, defaultDatabaseId, transactionNames);
}
/**
* xmybatis
*/
public XMybatis() {
String traceId = XUuidUtils.randomUUID();
XMybatisContext context = new XMybatisContext(traceId, "xstartup.mybatis");
try {
init(null, null, null, null, null, null, null, null);
} catch (Exception e) {
context.getLogger().error(e);
}
}
/**
* default信息只能在debug模式下才会生效
*
* @param dialectClass 方言班
* @param defaultSharding 默认分片
* @param defaultDriver 默认驱动程序
* @param defaultUrl 默认url
* @param defaultUser 默认用户
* @param defaultPassword 默认密码
* @param defaultDatabaseId 默认数据库id
* @param transactionNames 交易名称
*/
private XMybatis(Class<?> dialectClass,
String defaultSharding,
String defaultDriver,
String defaultUrl,
String defaultUser,
String defaultPassword,
String defaultDatabaseId,
String[] transactionNames) {
String traceId = XUuidUtils.randomUUID();
XMybatisContext context = new XMybatisContext(traceId, "xstartup.mybatis");
try {
init(dialectClass, defaultSharding, defaultDriver, defaultUrl, defaultUser, defaultPassword, defaultDatabaseId, transactionNames);
} catch (Exception e) {
context.getLogger().error(e);
}
}
/**
* 初始化
*
* @param dialectClass 方言
* @param defaultSharding 默认分片
* @param defaultDriver 默认驱动程序
* @param defaultUrl 默认url
* @param defaultUser 默认用户
* @param defaultPassword 默认密码
* @param defaultDatabaseId 默认数据库id
* @param transactionNames 交易名称
*/
private void init(Class<?> dialectClass,
String defaultSharding,
String defaultDriver,
String defaultUrl,
String defaultUser,
String defaultPassword,
String defaultDatabaseId,
String[] transactionNames) {
String traceId = XUuidUtils.randomUUID();
XMybatisContext context = new XMybatisContext(traceId, "xstartup.mybatis");
try {
if (XStartup.getCurrent().getEnv() == XEnv.Dev) {
this.dialectClass = dialectClass;
this.defaultSharding = defaultSharding;
this.defaultDriver = defaultDriver;
this.defaultUrl = defaultUrl;
this.defaultUser = defaultUser;
this.defaultPassword = defaultPassword;
this.defaultDatabaseId = defaultDatabaseId;
}
MapperScan enableJpaRepositories = this.getClass().getAnnotation(MapperScan.class);
this.name = enableJpaRepositories.sqlSessionFactoryRef().replace("sqlSessionFactoryRef.", "");
if (transactionNames == null || transactionNames.length == 0) {
this.transactionNames = new String[]{
String.format("transactionName:%s", this.name)
};
} else {
this.transactionNames = transactionNames;
}
String configName = this.name;
if (this.name.contains("*")) {
String[] packageNameArr = this.getClass().getPackage().getName().split("\\.");
configName = packageNameArr[0] + "." + packageNameArr[1] + "." + packageNameArr[2];
}
this.sqlSessionTemplateName = enableJpaRepositories.sqlSessionTemplateRef();
this.sqlSessionFactoryName = enableJpaRepositories.sqlSessionFactoryRef();
boolean isDefaultDbProperties = false;
this.sharding = context.getProperty(String.format("x.db.%s.sharding", configName), this.defaultSharding);
this.driver = context.getProperty(String.format("x.db.%s.driver", configName));
this.url = null;
this.user = null;
this.password = null;
this.databaseId = null;
if (XStringUtils.isEmpty(driver) || XStringUtils.isEmpty(sharding)) {
// 读取公共的数据库配置
isDefaultDbProperties = true;
sharding = context.getProperty("x.db.sharding", this.defaultSharding);
driver = context.getProperty("x.db.driver", this.defaultDriver);
url = context.getProperty("x.db.url", this.defaultUrl);
user = context.getProperty("x.db.user", this.defaultUser);
password = context.getProperty("x.db.password", this.defaultPassword);
databaseId = context.getProperty("x.db.databaseId", this.defaultDatabaseId);
this.naming = context.getProperty("x.db.naming", SNAKE_CASE);
} else {
url = context.getProperty(String.format("x.db.%s.url", configName));
user = context.getProperty(String.format("x.db.%s.user", configName));
password = context.getProperty(String.format("x.db.%s.password", configName));
databaseId = context.getProperty(String.format("x.db.%s.databaseId", configName));
this.naming = context.getProperty(String.format("x.db.%s.naming", configName), SNAKE_CASE);
}
context.getLogger().trace("{}.driver:{}", configName, driver);
context.getLogger().trace("{}.url:{}", configName, url);
context.getLogger().trace("{}.user:{}", configName, user);
context.getLogger().trace("{}.password:{}", configName, password);
context.getLogger().trace("{}.databaseId:{}", configName, databaseId);
context.getLogger().trace("{}.naming:{}", configName, this.naming);
if (XStringUtils.isEmpty(sharding)) {
sharding = "1";
}
String[] basePackages = enableJpaRepositories.basePackages();
if (basePackages.length > 1) {
throw new XServiceException(XError.Exception.getCode(), "暂不支持多个包路径");
}
String basePackage = basePackages[0];
this.mapperBasePackages = basePackage;
String[] basePackageArr = basePackage.split("\\.");
this.transactionManagerKey = MybatisResPool.getTransactionKey(this.driver, this.url, this.user, this.password);
this.dataSource = MybatisResPool.getDataSource(context, this.driver, this.url, this.user, this.password);
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
ResourceLoader resourceLoader = new DefaultResourceLoader();
ResourcePatternResolver resolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
Resource[] resources = resolver.getResources("classpath*:mybatis/mapper/" + basePackageArr[0] +
"/" + basePackageArr[1] +
"/" + basePackageArr[2] + "/**/*.xml");
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
// 放后面的先执行
sqlSessionFactoryBean.setPlugins(this.setPageInterceptor(),
mybatisPlusInterceptor,
new XMybatisDynamicQueryInterceptor(),
new XMybatisUpdateInterceptor());
sqlSessionFactoryBean.setMapperLocations(resources);
sqlSessionFactoryBean.setDataSource(dataSource);
MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
mybatisConfiguration.setLogImpl(XMybatisLogger.class);
mybatisConfiguration.setDatabaseId(databaseId);
XMybatisConf mybatisConf = XConfManager.findConf(XMybatisConf.class);
if (mybatisConf != null && mybatisConf.getCallSettersOnNulls()) {
mybatisConfiguration.setCallSettersOnNulls(true);
}
if (SNAKE_CASE.equals(this.naming)) {
mybatisConfiguration.setMapUnderscoreToCamelCase(true);
} else {
mybatisConfiguration.setMapUnderscoreToCamelCase(false);
}
sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);
GlobalConfig globalConfig = this.getGlobalConfig();
if (globalConfig != null) {
sqlSessionFactoryBean.setGlobalConfig(globalConfig);
}
this.sqlSessionFactory = sqlSessionFactoryBean.getObject();
this.sqlSessionTemplate = new SqlSessionTemplate(this.sqlSessionFactory);
this.dataSourceTransactionManager = MybatisResPool.getDataSourceTransactionManager(context, this.driver, this.url, this.user, this.password);
this.dataSourceTransactionManager.setRollbackOnCommitFailure(true);
this.transactionTemplate = new TransactionTemplate(this.dataSourceTransactionManager);
this.dataSourceHash = XEncryptUtils.md5X2(this.driver) + ":" + XEncryptUtils.md5X2(this.url) + ":" + XEncryptUtils.md5X2(this.user);
String jpaMapKey = this.getClass().getPackage().getName().replace(".mybatis", ".mapper");
jpaMap.put(jpaMapKey, this);
if (defaultMybatis == null && isDefaultDbProperties) {
defaultMybatis = this;
}
} catch (Exception e) {
context.getLogger().error(e);
}
}
/**
* 让子类进行重载,完成扩展
*
* @return
*/
public GlobalConfig getGlobalConfig() {
return null;
}
private void registerSqlSessionTemplateBean(BeanDefinitionRegistry beanDefinitionRegistry) {
Class<SqlSessionTemplate> tClass = SqlSessionTemplate.class;
beanDefinitionRegistry.registerBeanDefinition(this.sqlSessionTemplateName, BeanDefinitionBuilder.genericBeanDefinition(tClass, new Supplier<SqlSessionTemplate>() {
@Override
public SqlSessionTemplate get() {
return sqlSessionTemplate;
}
}).getBeanDefinition());
}
private void registerSqlSessionFactoryBean(BeanDefinitionRegistry beanDefinitionRegistry) {
Class<SqlSessionFactory> tClass = SqlSessionFactory.class;
beanDefinitionRegistry.registerBeanDefinition(this.sqlSessionFactoryName, BeanDefinitionBuilder.genericBeanDefinition(tClass, new Supplier<SqlSessionFactory>() {
@Override
public SqlSessionFactory get() {
return sqlSessionFactory;
}
}).getBeanDefinition());
}
private void registerPlatformTransactionManagerBean(String transactionManagerName, BeanDefinitionRegistry beanDefinitionRegistry) {
Class<PlatformTransactionManager> tClass = PlatformTransactionManager.class;
beanDefinitionRegistry.registerBeanDefinition(transactionManagerName, BeanDefinitionBuilder.genericBeanDefinition(tClass, new Supplier<PlatformTransactionManager>() {
@Override
public PlatformTransactionManager get() {
return dataSourceTransactionManager;
}
}).getBeanDefinition());
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
this.registerSqlSessionFactoryBean(beanDefinitionRegistry);
this.registerSqlSessionTemplateBean(beanDefinitionRegistry);
for (String name : this.transactionNames) {
this.registerPlatformTransactionManagerBean(name, beanDefinitionRegistry);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
@Override
public String toString() {
return "XMybatis{" +
"name='" + name + '\'' +
'}';
}
/**
* 设置分页拦截器
*
* @return {@link PageInterceptor }
*/
private PageInterceptor setPageInterceptor() {
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("offsetAsPageNum", "false");
properties.setProperty("rowBoundsWithCount", "false");
properties.setProperty("pageSizeZero", "true");
properties.setProperty("reasonable", "false");
properties.setProperty("supportMethodsArguments", "false");
properties.setProperty("returnPageInfo", "none");
properties.setProperty("autoRuntimeDialect", "true");
pageInterceptor.setProperties(properties);
return pageInterceptor;
}
}
\ No newline at end of file
...@@ -5,7 +5,7 @@ import org.mybatis.spring.annotation.MapperScan; ...@@ -5,7 +5,7 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler; import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler;
import xstartup.service.mybatis.XMybatis; import pps.core.common.mybatis.XMybatis;
/** /**
* mybatis 配置类 * mybatis 配置类
......
...@@ -5,7 +5,8 @@ import org.mybatis.spring.annotation.MapperScan; ...@@ -5,7 +5,8 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler; import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler;
import xstartup.service.mybatis.XMybatis; import pps.core.common.mybatis.XMybatis;
/** /**
* mybatis 配置类 * mybatis 配置类
......
...@@ -5,7 +5,7 @@ import org.mybatis.spring.annotation.MapperScan; ...@@ -5,7 +5,7 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler; import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler;
import xstartup.service.mybatis.XMybatis; import pps.core.common.mybatis.XMybatis;
/** /**
* mybatis 配置类 * mybatis 配置类
......
...@@ -5,7 +5,7 @@ import org.mybatis.spring.annotation.MapperScan; ...@@ -5,7 +5,7 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler; import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler;
import xstartup.service.mybatis.XMybatis; import pps.core.common.mybatis.XMybatis;
/** /**
......
...@@ -5,7 +5,8 @@ import org.mybatis.spring.annotation.MapperScan; ...@@ -5,7 +5,8 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler; import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler;
import xstartup.service.mybatis.XMybatis; import pps.core.common.mybatis.XMybatis;
/** /**
* mybatis 配置类 * mybatis 配置类
......
...@@ -5,7 +5,7 @@ import org.mybatis.spring.annotation.MapperScan; ...@@ -5,7 +5,7 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler; import pps.core.common.mybatis.MybaitisGlobalConfigSuppiler;
import xstartup.service.mybatis.XMybatis; import pps.core.common.mybatis.XMybatis;
/** /**
......
...@@ -30,12 +30,14 @@ x.db.url=@x.db.url@ ...@@ -30,12 +30,14 @@ x.db.url=@x.db.url@
x.db.user=@x.db.user@ x.db.user=@x.db.user@
x.db.password=@x.db.password@ x.db.password=@x.db.password@
x.db.naming=@x.db.naming@ x.db.naming=@x.db.naming@
x.db.databaseId=@x.db.databaseId@
x.db.pps.core.middle.sharding=@x.db.pps.core.middle.sharding@ x.db.pps.core.middle.sharding=@x.db.pps.core.middle.sharding@
x.db.pps.core.middle.driver=@x.db.pps.core.middle.driver@ x.db.pps.core.middle.driver=@x.db.pps.core.middle.driver@
x.db.pps.core.middle.url=@x.db.pps.core.middle.url@ x.db.pps.core.middle.url=@x.db.pps.core.middle.url@
x.db.pps.core.middle.user=@x.db.pps.core.middle.user@ x.db.pps.core.middle.user=@x.db.pps.core.middle.user@
x.db.pps.core.middle.password=@x.db.pps.core.middle.password@ x.db.pps.core.middle.password=@x.db.pps.core.middle.password@
x.db.pps.core.middle.naming=@x.db.pps.core.middle.naming@ x.db.pps.core.middle.naming=@x.db.pps.core.middle.naming@
x.db.pps.core.middle.databaseId=@x.db.pps.core.middle.databaseId@
# \u7981\u7528\u6821\u9A8C # \u7981\u7528\u6821\u9A8C
x.druid.validation-query= x.druid.validation-query=
# \u81EA\u5B9A\u4E49\u914D\u7F6E # \u81EA\u5B9A\u4E49\u914D\u7F6E
......
...@@ -25,12 +25,14 @@ x.db.url=jdbc:mysql://120.46.208.168:3306/gf_demo?allowPublicKeyRetrieval=true&c ...@@ -25,12 +25,14 @@ x.db.url=jdbc:mysql://120.46.208.168:3306/gf_demo?allowPublicKeyRetrieval=true&c
x.db.user=root x.db.user=root
x.db.password=vwy69PQDfShqozf4ISXEoQ== x.db.password=vwy69PQDfShqozf4ISXEoQ==
x.db.naming=snake-case x.db.naming=snake-case
x.db.databaseId=MySQL
x.db.pps.core.middle.sharding=1 x.db.pps.core.middle.sharding=1
x.db.pps.core.middle.driver=oracle.jdbc.OracleDriver x.db.pps.core.middle.driver=oracle.jdbc.OracleDriver
x.db.pps.core.middle.url=jdbc:oracle:thin:@192.168.0.128:1521/ORCLPDB x.db.pps.core.middle.url=jdbc:oracle:thin:@192.168.0.128:1521/ORCLPDB
x.db.pps.core.middle.user=DB_CONTRACT x.db.pps.core.middle.user=DB_CONTRACT
x.db.pps.core.middle.password=BJ8HiKUS_Rg= x.db.pps.core.middle.password=BJ8HiKUS_Rg=
x.db.pps.core.middle.naming=snake-case x.db.pps.core.middle.naming=snake-case
x.db.pps.core.middle.databaseId=Oracle
# \u81EA\u5B9A\u4E49\u914D\u7F6E # \u81EA\u5B9A\u4E49\u914D\u7F6E
#weather.file.temp.path=D:/home/weather/temp/receive #weather.file.temp.path=D:/home/weather/temp/receive
weather.file.temp.path=/home/weather-jar/temp/receive weather.file.temp.path=/home/weather-jar/temp/receive
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment