搭建一个SpringBoot项目(自用)

一、创建一个空的SpringBoot项目(就是依赖选个Web就行了)2022-7-10

git仓库
搭建一个SpringBoot项目(自用)_第1张图片

二、导包

    <dependencies>
        <!--Web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--阿里的json转换jar包-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>

        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--mybatis-plus-->
        <!--mybatis-plus是自己开发的,并非官方的-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <!--非官方: mybatis-spring-boot-starter-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <!--Druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>

        <!--Druid会使用log4j的日志记录,使用导入依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.11</version>
        </dependency>

        <!--JDBC-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--MySQL-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--mybatis-plus-generator 生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!-- freemarker,作为代码生成器mapper文件的模板引擎使用(当然也可以使用velocity,二选一即可) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <!--thymeleaf-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!--jcakson-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

三、写配置文件(最好,多创建几个application-{}.yaml文件)

application.yaml

spring:
  profiles:
    active: release

application-dev.yaml

spring:
  thymeleaf:
    cache: false
  datasource:
    username: root
    password: 123456
    #    假如时区报错了加  &serverTimezone=UTC
    url: jdbc:mysql://localhost:3306/school_vote?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true&allowMultiQueries=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    #    配置druid数据源
    type: com.alibaba.druid.pool.DruidDataSource
    #    配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #    如果允许时报错 java.lang.ClassNotFoundExcption :org.apache.log4j.Priority
    #    则导入 log4j 依赖即可,Maven 地址: https://mvnrepository.com/artifact/log4j/log4j
    druid:
      filters: stat,wall,log4j
      maxPoolPreparedStatementPerConnectionSize: 20
      useGlobalDataSourceStat: true
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  # 时间日期格式化 spring默认提交格式 yyyy/MM/dd
  mvc:
    format:
      date: yyyy-MM-dd HH:mm:ss
  servlet:
    multipart:
      enabled: true
      max-file-size: 30MB
      max-request-size: 30MB
#  redis
  redis:
    host: ip地址 # 默认127.0.0.1
    port: 6379 # 默认6379
    password: 密码


# 整合mybatis
mybatis:
  mapper-locations:
    - classpath:com/zhao/mapper/*.xml

#    配置日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 开启驼峰命名
    map-underscore-to-camel-case: true
  # 配置逻辑删除
  global-config:
    db-config:
      logic-delete-value: 1  # 1 为逻辑删除后的字段
      logic-not-delete-value: 0  # 0 为没有逻辑删除的字段
      logic-delete-field: deleted  #对应实体类的字段 写了这个在实体类中就不需要写注解了


application-release.yaml

spring:
  thymeleaf:
    cache: false
  datasource:
    username: 账号
    password: 密码
    #    假如时区报错了加  &serverTimezone=UTC
    url: jdbc:mysql://ip地址:3306/school_vote?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=true&allowMultiQueries=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    #    配置druid数据源
    type: com.alibaba.druid.pool.DruidDataSource
    #    配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #    如果允许时报错 java.lang.ClassNotFoundExcption :org.apache.log4j.Priority
    #    则导入 log4j 依赖即可,Maven 地址: https://mvnrepository.com/artifact/log4j/log4j
    druid:
      filters: stat,wall,log4j
      maxPoolPreparedStatementPerConnectionSize: 20
      useGlobalDataSourceStat: true
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
  # 时间日期格式化 spring默认提交格式 yyyy/MM/dd
  mvc:
    format:
      date: yyyy-MM-dd HH:mm:ss
  servlet:
    multipart:
      enabled: true
      max-file-size: 30MB
      max-request-size: 30MB
  #  redis
  redis:
    host: ip地址 # 默认127.0.0.1
    port: 6379 # 默认6379
    password: 密码


# 整合mybatis
mybatis:
  mapper-locations:
    - classpath:com/zhao/mapper/*.xml

#    配置日志
mybatis-plus:
  configuration:
    #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 开启驼峰命名
    map-underscore-to-camel-case: true
  # 配置逻辑删除
  global-config:
    db-config:
      logic-delete-value: 1  # 1 为逻辑删除后的字段
      logic-not-delete-value: 0  # 0 为没有逻辑删除的字段
      logic-delete-field: deleted  #对应实体类的字段 写了这个在实体类中就不需要写注解了

server:
  port: 9800

三.五、log4j.properties(关闭log4j)

log4j.logger.freemarker.cache=ERROR
log4j.logger.freemarker.beans=ERROR

四、创建项目结构

搭建一个SpringBoot项目(自用)_第2张图片

五、404、500页面

resources > error > 404.html(500.html)

搭建一个SpringBoot项目(自用)_第3张图片

六、工具类

1、JSON工具类(common包下)

SpringBoot的JSON工具类(java),用于前后端分离_我认不到你的博客-CSDN博客

2、Redis工具类(utils包下)

Redis工具类(redisTemplate)以及 redisTemplate 的用法_我认不到你的博客-CSDN博客

SpringBoot整合Rides_我认不到你的博客-CSDN博客

3、MD5工具类(utils包下)

/**
 * MD5工具类
 * @author PING.AN.ZHAO
 * @date   2022年7月10日
 */
public class MD5Util {
	public static String md5(String source) throws NoSuchAlgorithmException {
        String des = "";  
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] result = md.digest(source.getBytes());  
        StringBuilder buf = new StringBuilder();
        for (byte b : result) {
            buf.append(String.format("%02X", b));
        }  
        des = buf.toString().toLowerCase();  
        return des;  
    }
}

此工具类转自:Java MD5 加密工具类_LookingTomorrow的博客-CSDN博客_java md5加密工具类

4、字母编号+数字,并且需要自增工具类

/**
 * @Role 字母+数字工具类
 * @Author 赵平安
 * @GMTCreate   2022年7月20日
 * @Modifier  修改bug,且第一个set弃用
 * @GMTModified 赵平安
 * @ModifyContent  2022年7月28日
 */
public class LetterNumberUtil {

    public static String gal(String LetterNumber,String name) {
        //没有的时候填充
        if (LetterNumber==null||LetterNumber.trim().isEmpty()){
            return name+"000001";
        }
        //截取头部字母编号
        StringBuffer head = new StringBuffer();
        String[] split = LetterNumber.split("");
        for (String s : split) {
            if (!s.matches("^[0-9]*$")){
                head.append(s);
            }else break;
        }
        //截取尾部数字
        String tail = LetterNumber.replaceAll(" ","").substring(head.length(), LetterNumber.replaceAll(" ","").length());
        //尾部数字 +1
        int num = Integer.valueOf(tail) + 1;
        //填充 0
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < tail.length(); i++) {
            buffer.append(0);
        }
        String number = buffer.toString();
        //合并字符串
        number = number + num;
        //进位
        if (tail.length()<String.valueOf(num).length()){
            number = number.substring(number.length() - tail.length()-1, number.length());
        }else number = number.substring(number.length() - tail.length(), number.length());
        return head + number;
    }
}

七、配置类(config包下)

1、MyBatisPlusConfig

@MapperScan("com.zhao.mapper")//扫描我们的mapper文件夹
@EnableTransactionManagement //事务控制
@Configuration //配置类
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //注册乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        //分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }


}

2、RedisConfig

@Configuration
public class RedisConfig {

    // 编写我们自己的 RedisTemplate,一般拿来用就行了
    @Bean
    @SuppressWarnings("all") //这tm是个坑,我现在不知道这个注释是干嘛的,但是下面这个注解和这串注解没有的话
                            // RedisConnectionFactory redisConnectionFactory 会爆红,下面这注解没有注释的话,就序列化不了
//    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        //我们为了自己开发方便,一般直接使用类型
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // Json序列化配置
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);  这个被弃用了,所以现在要用 activateDefaultTyping
        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(mapper);

        // String 的序列化
        RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();

        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }
}

3、WebConfig(拦截器)

@Configuration
public class WebConfig implements WebMvcConfigurer{
    @Autowired
    VoteLoginInterceptor voteLoginInterceptor;
    @Autowired
    AdminLoginInterceptor adminLoginInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自己的拦截器,并设置拦截的请求路径
        //addPathPatterns为拦截此请求路径的请求
        //excludePathPatterns为不拦截此路径的请求
        registry.addInterceptor(voteLoginInterceptor).addPathPatterns("/vote/voting2/**","/vote/whetherVoting/**","/vote/index/voting/**").excludePathPatterns("/static/**");
        registry.addInterceptor(adminLoginInterceptor).addPathPatterns("/index/**").excludePathPatterns("/","/static/**","/index");
    }
 
}

4、DruidConfig

@Configuration
public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource druidDataSource(){
        return new DruidDataSource();
    }

    @Bean
    //后台监控功能:相当于web.xml
    //因为Springboot 内置了 servlet 容器,所以没有web.xml , 代替方法:ServletRegistrationBean
    public ServletRegistrationBean StatViewServlet(){
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        //后台需要有人登录,账号密码配置
        HashMap<String, String> initParameters = new HashMap<>();
        //增加配置
        initParameters.put("loginUserName","admin");//登录的key是固定参数:loginUserName  loginPassword
        initParameters.put("loginPassword","123456");
        //允许谁可以访问
//        initParameters.put("allow","localhost");//仅允许本地登录
        initParameters.put("allow","");//允许所有人登录

        //禁止谁能访问
//        initParameters.put("kuangshen","192.168.11.123");//禁止这个ip地址访问

        bean.setInitParameters(initParameters);//设置初始化参数
        return bean;
    }
    @Bean
    //filter
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new WebStatFilter());
        //可以过滤哪些请求
        HashMap<String, String> initParameters = new HashMap<>();
        //这些东西不进行统计
        initParameters.put("exclusions","*.js,*.css,/druid/*");

        bean.setInitParameters(initParameters);
        return bean;
    }


}

5、跨域问题

/**
 * @Role 跨域请求
 * @Author 赵平安
 * @GMTCreate   2022年7月21日
 * @Modifier
 * @GMTModified
 * @ModifyContent
 */
@Configuration
public class CorsConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") //拦截所有请求
                //是否发送Cookie,用于凭证请求, 默认不发送cookie。
                .allowCredentials(true)
                //出现的问题:当allowCredentials为真时,allowedorigin不能包含特殊值"*",因为不能在"访问-控制-起源“响应头中设置该值。要允许凭证到一组起源,显示地列出它们,或者考虑使用"allowedOriginPatterns”代替。
//                .allowedOrigins("*") //可跨域的域名
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")  // 允许跨域的方法,可以单独配置
                //配置预检请求的有效时间, 单位是秒,表示:在多长时间内,不需要发出第二次预检请求。
                .maxAge(1800)
                //配置允许的自定义请求头,用于 预检请求。
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

八、配置拦截器(interceptor包下)

@Slf4j
@Component
public class AdminLoginInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行前
     * 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
     * 返回 true 表示继续向下执行,返回 false 表示中断后续操作
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object loginUser = request.getSession().getAttribute("adminInfo");
        if (loginUser == null) {
            //未登录,返回登陆页
            request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
            request.getRequestDispatcher("/").forward(request, response);
            return false;
        } else {
            //放行
            return true;
        }
    }
    /**
     * 目标方法执行后
     * 该方法在控制器处理请求方法调用之后、解析视图之前执行
     * 可以通过此方法对请求域中的模型和视图做进一步修改
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        log.info("postHandle执行{}", modelAndView);
    }
    /**
     * 页面渲染后
     * 该方法在视图渲染结束后执行
     * 可以通过此方法实现资源清理、记录日志信息等工作
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        log.info("afterCompletion执行异常{}", ex);
    }
}

九、MyBatisPlus填充策略(handler包下)

@Slf4j  //日志
@Component //一定不要忘记把处理器加到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
    //插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill.....");
        this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);
        this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
    }
    //更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill.....");
        this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);

    }
}

十、controller、service、pojo、mapper自动生成(测试类中)

/**
 * 

* 代码生成器(快速版本) *

* * @author 赵平安 * @since 2022-4-12 0022 16:51 */
public class FastCodeGenerator { // 基础信息配置 // 数据库连接字符 private static final String URL = "jdbc:mysql://127.0.0.1:3306/school_vote?useUnicode=true&serverTimezone=UTC&useSSL=false&characterEncoding=utf8"; // 数据库用户名 private static final String USERNAME = "root"; // 数据库密码 private static final String PASSWORD = "123456"; // 项目根路径。生成结果如:D:\MyProject\spring-boot private static final String projectRootPath = System.getProperty("user.dir"); // 项目根路径(测试用,非通用)(此句是本项目测试用的。实际项目中,包括多模块项目,请注释掉此句,使用上句) // private static final String projectRootPath = System.getProperty("user.dir") + "/study-mybatis-plus-fast-generator"; // 父包名。用于生成的java文件的import。 // private static final String parentPackageName = "com.cxhit.mybatisplus.generator"; private static final String parentPackageName = "com.zhao.projectname"; /** * 执行此处 */ public static void main(String[] args) { // 简单示例,适用于单模块项目 simpleGenerator(); // 完整示例,适用于多模块项目 // completeGenerator(); } /** * 【单模块】简单的实现方案 */ protected static void simpleGenerator() { // 包路径 String packagePath = projectRootPath + "/src/main/java"; // XML文件的路径 String mapperXmlPath = projectRootPath + "/src/main/resources/Mybatis/mapper"; // 开始执行代码生成 FastAutoGenerator.create(URL, USERNAME, PASSWORD) // 1. 全局配置 .globalConfig(builder -> builder // 作者名称 .author("赵平安") // 开启覆盖已生成的文件。注释掉则关闭覆盖。 // .fileOverride() // 禁止打开输出目录。注释掉则生成完毕后,自动打开生成的文件目录。 .disableOpenDir() // 指定输出目录。如果指定,Windows生成至D盘根目录下,Linux or MAC 生成至 /tmp 目录下。 .outputDir(packagePath) // 开启swagger2.注释掉则默认关闭。 // .enableSwagger() // 指定时间策略。 .dateType(DateType.TIME_PACK) // 注释时间策略。 .commentDate("yyyy-MM-dd") ) // 2. 包配置 .packageConfig((scanner, builder) -> builder // 设置父表名 .parent(parentPackageName) // .moduleName(scanner.apply("请输入模块名:")) // mapper.xml 文件的路径。单模块下,其他文件路径默认即可。 .pathInfo(Collections.singletonMap(OutputFile.xml, mapperXmlPath)) //改实体类名字为pojo .entity("pojo") ) // 3. 策略配置 .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?生成所有表,请输入[all]:"))) // 阶段1:Entity实体类策略配置 .entityBuilder() // 开启生成实体时生成字段注解。 // 会在实体类的属性前,添加[@TableField("nickname")] .enableTableFieldAnnotation() // 逻辑删除字段名(数据库)。 .logicDeleteColumnName("deleted") // 逻辑删除属性名(实体)。 // 会在实体类的该字段属性前加注解[@TableLogic] .logicDeletePropertyName("deleted") // 乐观锁 .versionColumnName("version") .versionPropertyName("version") // 会在实体类的该字段上追加注解[@TableField(value = "create_time", fill = FieldFill.INSERT)] .addTableFills(new Column("create_time", FieldFill.INSERT)) // 会在实体类的该字段上追加注解[@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)] .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) // 阶段2:Mapper策略配置 .mapperBuilder() // 开启 @Mapper 注解。 // 会在mapper接口上添加注解[@Mapper] .enableMapperAnnotation() // 启用 BaseResultMap 生成。 // 会在mapper.xml文件生成[通用查询映射结果]配置。 .enableBaseResultMap() // 启用 BaseColumnList。 // 会在mapper.xml文件生成[通用查询结果列 ]配置 .enableBaseColumnList() // 阶段4:Controller策略配置 .controllerBuilder() // 会在控制类中加[@RestController]注解。 .enableRestStyle() // 开启驼峰转连字符 .enableHyphenStyle() .build() ) // 4. 模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker //.templateEngine(new BeetlTemplateEngine()) .templateEngine(new FreemarkerTemplateEngine()) // 5. 执行 .execute(); } /** * 【多模块使用】完整的实现方案 */ protected static void completeGenerator() { //【1】基础信息配置 // 指定模块名,用于生成的java文件的import。 String moduleName = scanner("请输入模块名:"); // 六个文件的路径。多模块项目下,一般来说每个文件的路径都是不同的(根据项目实际,可能在不同的模块下)。 String entityPath = projectRootPath + "/project-entity/src/main/java/com/yourdomain/projectname/entity/" + moduleName; String mapperPath = projectRootPath + "/project-dao/src/main/java/com/yourdomain/projectname/mapper/" + moduleName; String mapperXmlPath = projectRootPath + "/project-dao/src/main/resources/mapper/" + moduleName; String servicePath = projectRootPath + "/project-service/src/main/java/com/yourdomain/projectname/service/" + moduleName; String serviceImplPath = projectRootPath + "/project-service/src/main/java/com/yourdomain/projectname/service/" + moduleName + "/impl"; String controllerPath = projectRootPath + "/project-controller/src/main/java/com/yourdomain/projectname/controller/" + moduleName; // 关于以上写法的解释: // --- 假设我们的项目有四个模块:project-entity、project-dao、project-service、project-controller // --- project-entity 的包路径:com.yourdomain.projectname.eneity, // ---则生成system模块下的sys_user表,生成的实体文件将放在:com.yourdomain.projectname.entity.system包下,SysUser.java。 // --- project-dao 的包路径:com.yourdomain.projectname.mapper, // ---则生成system模块下的sys_user表,生成的mapper接口文件将放在:com.yourdomain.projectname.mapper.system包下,类名为:SysUserMapper.java。 // --- 其他文件以此类推,即每个模块放MVC结构中对应的类型文件。 // --- 注意:这里最后的文件路径修改了,下文配置中的【2 包配置】中的包路径也要同步修改!否则生成的java文件,首句import会报错。原因是路径错误。 // 【2】开始执行代码生成 FastAutoGenerator.create(URL, USERNAME, PASSWORD) // 1. 全局配置 .globalConfig(builder -> builder // 作者名称 .author("赵平安") // 开启覆盖已生成的文件。注释掉则关闭覆盖。请谨慎开启此选项! // .fileOverride() // 禁止打开输出目录。注释掉则生成完毕后,自动打开生成的文件目录。 .disableOpenDir() // 指定输出目录。多模块下,每个类型的文件输出目录不一致,在包配置阶段配置。 // .outputDir(packagePath) // 开启swagger2。注释掉则默认关闭。 // .enableSwagger() // 开启 kotlin 模式。注释掉则关闭此模式 // .enableKotlin() // 指定时间策略。 .dateType(DateType.TIME_PACK) // 注释时间策略。 .commentDate("yyyy-MM-dd") ) // 2. 包配置 .packageConfig((scanner, builder) -> builder // 阶段1:各个文件的包名设置,用来拼接每个java文件的第一句:package com.XXX.XXX.XXX.xxx; // 父包名配置 .parent(parentPackageName) // 输入模块名。此模块名会在下面的几个包名前加。多模块项目,请根据实际选择是否添加。 // .moduleName(moduleName) .entity("entity." + moduleName) .mapper("mapper." + moduleName) .service("service." + moduleName) .serviceImpl("service." + moduleName + ".impl") .controller("controller." + moduleName) .other("other") // 阶段2:所有文件的生成路径配置 .pathInfo( new HashMap<OutputFile, String>() {{ // 实体类的保存路径 put(OutputFile.entity, entityPath); // mapper接口的保存路径 put(OutputFile.mapper, mapperPath); // mapper.xml文件的保存路径 put(OutputFile.xml, mapperXmlPath); // service层接口的保存路径 put(OutputFile.service, servicePath); // service层接口实现类的保存路径 put(OutputFile.serviceImpl, serviceImplPath); // 控制类的保存路径 put(OutputFile.controller, controllerPath); }} ) ) // 3. 策略配置【请仔细阅读每一行,根据项目实际项目需求,修改、增删!!!】 .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?生成所有表,请输入[all]:"))) // 阶段1:Entity实体类策略配置 .entityBuilder() // 设置父类。会在生成的实体类名后:extends BaseEntity // .superClass(BaseEntity.class) // 禁用生成 serialVersionUID。(不推荐禁用) // .disableSerialVersionUID() // 开启生成字段常量。 // 会在实体类末尾生成一系列 [public static final String NICKNAME = "nickname";] 的语句。(一般在写wapper时,会用到) // .enableColumnConstant() // 开启链式模型。 // 会在实体类前添加 [@Accessors(chain = true)] 注解。用法如 [User user=new User().setAge(31).setName("snzl");](这是Lombok的注解,需要添加Lombok依赖) // .enableChainModel() // 开启 lombok 模型。 // 会在实体类前添加 [@Getter] 和 [@Setter] 注解。(这是Lombok的注解,需要添加Lombok依赖) // .enableLombok() // 开启 Boolean 类型字段移除 is 前缀。 // .enableRemoveIsPrefix() // 开启生成实体时生成字段注解。 // 会在实体类的属性前,添加[@TableField("nickname")] .enableTableFieldAnnotation() // 逻辑删除字段名(数据库)。 .logicDeleteColumnName("deleted") // 逻辑删除属性名(实体)。 // 会在实体类的该字段属性前加注解[@TableLogic] .logicDeletePropertyName("deleted") // 数据库表映射到实体的命名策略(默认下划线转驼峰)。一般不用设置 // .naming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略(默认为 null,未指定按照 naming 执行)。一般不用设置 // .columnNaming(NamingStrategy.underline_to_camel) // 添加父类公共字段。 // 这些字段不会出现在新增的实体类中。 .addSuperEntityColumns("id", "delete_time") // 添加忽略字段。 // 这些字段不会出现在新增的实体类中。 // .addIgnoreColumns("password") // 添加表字段填充 // 会在实体类的该字段上追加注解[@TableField(value = "create_time", fill = FieldFill.INSERT)] .addTableFills(new Column("create_time", FieldFill.INSERT)) // 会在实体类的该字段上追加注解[@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)] .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) // 全局主键类型。如果MySQL主键设置为自增,则不需要设置此项。 // .idType(IdType.AUTO) // 格式化文件名称。 // 如果不设置,如表[sys_user]的实体类名是[SysUser]。设置成下面这样,将是[SysUserEntity] // .formatFileName("%sEntity") // 阶段2:Mapper策略配置 .mapperBuilder() // 设置父类 // 会在mapper接口方法集成[extends BaseMapper] // .superClass(BaseMapper.class) // 开启 @Mapper 注解。 // 会在mapper接口上添加注解[@Mapper] .enableMapperAnnotation() // 启用 BaseResultMap 生成。 // 会在mapper.xml文件生成[通用查询映射结果]配置。 .enableBaseResultMap() // 启用 BaseColumnList。 // 会在mapper.xml文件生成[通用查询结果列 ]配置 .enableBaseColumnList() // 设置缓存实现类 // .cache(MyMapperCache.class) // 格式化 mapper 文件名称。 // 如果不设置,如表[sys_user],默认的文件名是[SysUserMapper]。写成下面这种形式后,将变成[SysUserDao]。 // .formatMapperFileName("%sDao") // 格式化 xml 实现类文件名称。 // 如果不设置,如表[sys_user],默认的文件名是[SysUserMapper.xml],写成下面这种形式后,将变成[SysUserXml.xml]。 // .formatXmlFileName("%sXml") // 阶段3:Service策略配置 // .serviceBuilder() // 设置 service 接口父类 // .superServiceClass(BaseService.class) // 设置 service 实现类父类 // .superServiceImplClass(BaseServiceImpl.class) // 格式化 service 接口文件名称 // 如果不设置,如表[sys_user],默认的是[ISysUserService]。写成下面这种形式后,将变成[SysUserService]。 // .formatServiceFileName("%sService") // 格式化 service 实现类文件名称 // 如果不设置,如表[sys_user],默认的是[SysUserServiceImpl]。 // .formatServiceImplFileName("%sServiceImpl") // 阶段4:Controller策略配置 .controllerBuilder() // 设置父类。 // 会集成此父类。 // .superClass(BaseController.class) // 开启生成 @RestController 控制器 // 会在控制类中加[@RestController]注解。 .enableRestStyle() // 开启驼峰转连字符 .enableHyphenStyle() // 最后:构建 .build() ) //模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker //.templateEngine(new BeetlTemplateEngine()) .templateEngine(new FreemarkerTemplateEngine()) // 执行 .execute(); } // 处理 all 情况 protected static List<String> getTables(String tables) { return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(",")); } /** *

* 读取控制台内容 *

*/
private static String scanner(String tip) { Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("请输入").append(tip).append(":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotBlank(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } }

十一、上传Git

Git使用详解全图文(基于gitee),看这一篇就够了_我认不到你的博客-CSDN博客_git的使用

.gitignore文件

# Compiled class file
*.class

# Eclipse
.project
.classpath
.settings/

# Intellij
*.ipr
*.iml
*.iws
.idea/

# Maven
target/

# Gradle
build
.gradle

# Log file
*.log
log/

# out
**/out/

# Mac
.DS_Store

# others
*.jar
*.war
*.zip
*.tar
*.tar.gz
*.pid
*.orig
temp/


搭建一个SpringBoot项目(自用)_第4张图片

十二、Swagger+knife4j

Swagger3+knife4j的使用_我认不到你的博客-CSDN博客

十三、MinIO

使用Docker搭建分布式文件存储系统MinIO

十四、运维:Jenkins

jenkins使用docker安装保姆级教程(面向小白教程,最新最全,全图文)2022-8-1,不会docker也没关系
使用jenkins+gitee创建docker镜像并运行

十五、操作Excel

JAVA操作Excel(POI、easyPOI、easyExcel)

你可能感兴趣的:(springboot,spring,boot,mybatis,redis,后端,java)