springboot,mybatis-puls,mysql,redis基础架子
springboot: 2.6.6 , springcloud: 2021.0.1 ,spring-cloud-alibaba: 2021.0.1.0pom文件:
4.0.0 org.springframework.boot spring-boot-starter-parent 2.6.6 xxx xz 1.1.0-SNAPSHOT jar 2021.0.1 2021.0.1.0 3.4.0 2.0.0 1.2.67 0.9.1 2.9.2 1.5.22 5.4.2 4.1.2 3.13.6 2.3 true org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba.version} pom import org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-starter-test org.springframework.security spring-security-crypto org.projectlombok lombok org.springframework.boot spring-boot-starter-data-redis org.redisson redisson-spring-boot-starter ${redisson.version} org.springframework.cloud spring-cloud-starter-bootstrap com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.baomidou mybatis-plus-boot-starter ${mybatis-plus.version} com.baomidou mybatis-plus-generator ${mybatis-plus.version} com.baomidou mybatis-plus-extension ${mybatis-plus.version} mysql mysql-connector-java com.github.ulisesbocchio jasypt-spring-boot-starter ${jasypt.spring.boot.starter.version} com.alibaba fastjson ${fastjson.version} io.springfox springfox-swagger2 ${swagger2.version} io.springfox springfox-swagger-ui ${swagger2.version} io.swagger swagger-annotations ${io.swagger.version} io.swagger swagger-models ${io.swagger.version} org.apache.poi poi-ooxml ${poi-ooxml.version} cn.hutool hutool-all ${hutool.version} io.jsonwebtoken jjwt ${jwt.version} org.apache.commons commons-lang3 org.aspectj aspectjweaver org.apache.velocity velocity-engine-core ${velocity-engine-core.version} javax.validation validation-api xxxx org.springframework.boot spring-boot-maven-plugin
配置文件:
server: port: 8080spring: servlet: multipart: max-file-size: 2048MB max-request-size: 10240MB jackson: default-property-inclusion: non_null date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 mvc: pathmatch: matching-strategy: ant-path-matcher redis: password: ${redis.cluster.password} cluster: nodes: ${redis.cluster.nodes} max-redirects: 3 lettuce: pool: max-idle: 16 #最大空闲连接 默认为8 max-active: 32#最大连接数(使用负值表示没有限制) 默认为8 min-idle: 8 #最小空闲连接 默认为 0 max-wait: 5000ms #最大阻塞等待时间(使用负值表示没有限制) 默认为-1 datasource: url: jdbc:mysql://${db.host}:${db.port}/${db.database}?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=true&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&tinyInt1isBit=false username: ${db.username} password: ${db.password}#--------------------------- mybatis-plus-------------------------mybatis-plus: mapper-locations: classpath*:com//mapping/*.xml global-config: db-config: id-type: auto logic-delete-value: 1 logic-not-delete-value: 0 configuration: map-underscore-to-camel-case: true cache-enabled: true lazyLoadingEnabled: true multipleResultSetsEnabled: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
package ;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;import org.springframework.util.ReflectionUtils;import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.ParameterBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.schema.ModelRef;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.Parameter;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;/ * Swagger配置 */@EnableSwagger2@Configuration@Profile({"dev","test","poc","future", "local"})public class SwaggerConfig { @Bean public Docket authzApi() { //增加头部参数 ParameterBuilder headerParam = new ParameterBuilder(); headerParam.name("token").description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build(); /*ParameterBuilder appKeyParam = new ParameterBuilder(); appKeyParam.name("appKey").description("appKey").modelRef(new ModelRef("string")).parameterType("header").required(false).build();*/ List parameterList = new ArrayList(); parameterList.add(headerParam.build()); //parameterList.add(appKeyParam.build()); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo("接口文档","接口文档","1.0.0")) .select() .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) //.apis(RequestHandlerSelectors.basePackage("com.*.*")) .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) .paths(PathSelectors.any()) .build() .groupName("v1.0.1") .globalOperationParameters(parameterList).enable(true) ; } private ApiInfo apiInfo(String name, String description, String version) { return new ApiInfoBuilder().title(name).description(description).version(version).build(); } @Bean public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { return new BeanPostProcessor() { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof WebMvcRequestHandlerProvider ) { customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); } return bean; } private void customizeSpringfoxHandlerMappings(List mappings) { List copy = mappings.stream() .filter(mapping -> mapping.getPatternParser() == null) .collect(Collectors.toList()); mappings.clear(); mappings.addAll(copy); } @SuppressWarnings("unchecked") private List getHandlerMappings(Object bean) { try { Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); field.setAccessible(true); return (List) field.get(bean); } catch (IllegalArgumentException | IllegalAccessException e) { throw new IllegalStateException(e); } } }; }}
RedisConfig:
package ;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.StringRedisTemplate;import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport { / * 管理缓存 */ @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { return RedisCacheManager.create(factory); } / * RedisTemplate配置 */ @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setConnectionFactory(factory); return redisTemplate; } @Bean public StringRedisTemplate strRedisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(factory); return template; }}
MybatisPlusConfig:
package ;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.annotation.EnableTransactionManagement;/ * MyBatisPlus配置 */@EnableTransactionManagement@Configurationpublic class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; }}
CodeGenerator:
package ;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.InjectionConfig;import com.baomidou.mybatisplus.generator.config.*;import com.baomidou.mybatisplus.generator.config.po.TableInfo;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import org.apache.commons.lang3.StringUtils;import java.util.ArrayList;import java.util.List;public class CodeGenerator { private static String projectPath = "D:\\AAA"; private static String modularName = "bu"; public static GlobalConfig gc() { GlobalConfig gc = new GlobalConfig(); gc.setOutputDir(projectPath); gc.setAuthor("NIUBI"); gc.setOpen(false); gc.setSwagger2(true); return gc; } public static DataSourceConfig dsc() { DataSourceConfig dsc = new DataSourceConfig(); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername(""); dsc.setPassword(""); dsc.setUrl("jdbc:mysql://xx.xx.xxx:3306/ku?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=true&serverTimezone=Asia/Shanghai"); return dsc; } public static PackageConfig packageConfig(){ PackageConfig pc = new PackageConfig(); String standardModularPath = ""; if(StringUtils.isNotBlank(modularName)){ standardModularPath += "." + modularName; } pc.setParent(standardModularPath); pc.setEntity("model"); pc.setMapper("dao"); pc.setXml("dao.mapping"); pc.setService("service"); pc.setController("controller"); pc.setServiceImpl("service.impl"); return pc; } public static void main(String[] args) { // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 mpg.setGlobalConfig(gc()); // 数据源配置 mpg.setDataSource(dsc()); // 包配置 PackageConfig pc = packageConfig(); mpg.setPackageInfo(pc); // 自定义配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; // String templatePath = "/templates/mapper.xml.ftl"; String templatePath = "/templates/mapper.xml.vm"; List focList = new ArrayList(); focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { return projectPath + "/" + pc.getParent().replaceAll("\\.", "/") + "/" + pc.getXml().replaceAll("\\.", "/") + "/" + tableInfo.getEntityName() + "Mapper.xml"; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setXml(null); mpg.setTemplate(templateConfig); StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); //strategy.setTablePrefix("t_"); //strategy.setSuperEntityClass(BaseEntity.class); //strategy.setSuperControllerClass(BaseController.class); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); strategy.setInclude( "需要生成的表" ); strategy.setControllerMappingHyphenStyle(true); mpg.setStrategy(strategy); mpg.execute(); }}