后端学习开发【2】——初始化 Spring boot 工程

257 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、快速创建 Spring boot 项目

第一步:新建一个项目目录

我的目录是:D:\giteeSpace\myExercise\my_project

第二步:初始化 Spring Initializer 工程

打开 IDE 工具 IDEA,点击 file->new->Project,选择 Spring Initializer;填写 Name ,Location (第一步中的目录),language 选择 Java,Type 选择 Maven,填写 Group ,Project SDK 选择 1.8 版本,Java 选择 8(根据个人安装的 Java 版本来选择)。

1.png

点击 Next,勾选 Lombok。

2.png

点击 Finish 即可初始化一个spring boot 项目,初始化完成后的样子如下图所示:

3.png

二、引入项目依赖

往项目的 pom.xml 文件中引入依赖,主要依赖有 spring-boot 依赖,mybatis-plus 依赖,mysql 依赖,lombok 依赖等等,下面是我的 pom.xml 文件,对于有些依赖可根据具体的项目需求删减:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.qq</groupId>
    <artifactId>first_project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>first_project</name>
    <description>first_project</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>20.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.1</version>
            <scope>test</scope>
        </dependency>
        <!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.github.yedaxia</groupId>
            <artifactId>japidocs</artifactId>
            <version>1.4.3</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>
        <!-- 解密程序 https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.68</version>
        </dependency>
        <!--JWT 依赖 -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.4.0</version>
        </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>
</project>

此处需要注意的是,在引入这些依赖以后会报错,有些是因为项目所依赖的 maven-repository 中没有该依赖,有些是因为不支持该版本的依赖,我们可以打开本地的 maven-repository 进行比对修改,下面是我的 maven-repository 路径:

4.png

三、编写代码生成器

代码生成器可以帮助我们快速地将数据库中的表生成对应的 entity、mapper、service 及 controller 文件,具体可以参考 MyBatis-Plus 官网:

5.jpg

下面是我的代码生成器,相关的数据库信息及包信息等信息,大家可以根据自己的进行修改配置:

package com.qq.first_project;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
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 com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import org.junit.platform.commons.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CodeGenerator {

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }
    
    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        // System.out.println("projectPath = " + projectPath);
        gc.setOutputDir(projectPath + "/src/main/java");
        // gc.setOutputDir("D:\\test");
        gc.setAuthor("Qiu");
        gc.setOpen(false);
        // gc.setSwagger2(true); 实体属性 Swagger2 注解
        gc.setServiceName("%sService");
        mpg.setGlobalConfig(gc);
        
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("Qq654321");
        mpg.setDataSource(dsc);
        
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(null);
        pc.setParent("com.qq.first_project");
        mpg.setPackageInfo(pc);
        
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        
        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";
        
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/com/qq/first_pro/mapper/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_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.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix("m_");
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        
        // 执行
        mpg.execute();
    }
}

以上配置中,需要注意 dsc.setDriverName 的配置,会有两种情况:

  • dsc.setDriverName("com.mysql.jdbc.Driver");
  • dsc.setDriverName("com.mysql.cj.jdbc.Driver");

四、运行代码生成器

右键点击代码生成器 CodeGenerator,选择 run 运行,输入数据库表名 user:

6.png

回车即可自动生成user对应的 entity、mapper、service 及 controller 代码:

7.png

五、配置 application.yml 文件

将项目 resources 目录下的 application.properties 文件重命名为 application.yml,然后配置服务启动的端口为:8110(看个人喜好),连接数据库的配置,日期格式配置,日志配置等等:

8.png

具体配置如下:

server:
  port: 8110 #端口号
  
spring:
  profiles:
    active: dev
  application:
    name: first-service
  datasource: # mysql
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&characterEncoding=utf-8
    username: root
    password: Qq654321
    
  #spring:
  jackson: 
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  mvc:
    throw-exception-if-no-handler-found: true
  web:
    resources:
      add-mappings: false
      
#mybatis
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#  global-config:
#    db-config:
#      logic-delete-value: 1
#      logic-not-delete-value: 0
#      id-type: auto

六、在启动类上添加 @MapperScan 注解

其主要作用就是,当项目启动以后,自动扫描 mapper 文件:

9.png

具体代码如下:

package com.qq.first_project;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.qq.first_project.mapper")
public class FirstProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(FirstProjectApplication.class, args);
    }
}

七、编写测试类

第一步:在 UserMapper 的 “{}” 内按下 Alt+ Insert ,选择 Test :

10.png

第二步:在弹出的窗口中,点击“ok”:

11.png

第三步:自动生成测试类 UserMapperTest:

12.png

第四步:编写查询 user 的代码

package com.qq.first_project.mapper;

import com.qq.first_project.FirstProjectApplication;
import com.qq.first_project.entity.User;
import com.qq.first_project.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest(classes = FirstProjectApplication.class)
class UserMapperTest {

    @Resource
    UserService userService;
    
    @Test
    public void test(){
        List<User> userList = userService.list();
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

第五步:执行测试类,查看测试结果

执行结果如下图所示:

13.png

成功拿到数据库中 user 表的数据,说明后端与数据库的连接成功。

到此,整个项目的初始化算是完成了,接下来我们将编写后端的一些工具类代码,例如:封装结果集、日期处理、解决跨域请求等等,为实现增删查改功能建立基础。