Springboot搭建web服务

本文将展示利用 Springboot 搭建 web 后台服务的详细流程。

1 系统创建

项目创建文章参考:https://blog.csdn.net/baidu_39298625/article/details/98102453

项目创建参考这篇文章,依照前 9 点完成项目的搭建即可,建议研究其文章的后续内容了解 Springboot 在编写 web后台服务时的基础内容,也便于掌握本文的内容。

本文系统github地址:https://github.com/yr0418/JavaProgram

本系统相关的代码我不会直接贴出,自行下载我的github项目


2 系统目录

2.1 系统目录展示

项目目录如下所示,其中, Interface:CustomMapper 和 包:web.common 是由于我自己的项目引用了 tk.mybatis。在一般的项目中无需使用,这两项内容可忽略。
在这里插入图片描述


2.2 各包作用解释

2.2.1 java/resources

java 包下保存系统所有的代码,resources 包下保存系统相关的资源文件

2.2.2 config

保存系统相关的配置,不同于配置文件,config 包里面的内容多是对系统的配置进行操作的代码

2.2.3 mybatis

mybatis 架构相关的代码的保存,pojo 用以保存实体类,mapper 用以保存 实体类的 mapper层,bean 用于保存为适应系统需要而创建的实体类,且该实体类在数据库中没有映射。

2.2.4 utils

保存系统需要使用的工具类,当你的系统需要某些工具类时,可以放在这个包内

2.2.5 web

保存实现 web 服务的包,service 与 controller 保存实体类对应的 service层 和 controller层,用以实现 API服务。common包与 socket包 是我个人项目的包,可忽略。当你的项目需要添加其他的 web服务 时,可将相应的代码放在这里。

2.2.6 WorkApplication

Springboot 的启动类。

2.2.7 db

database,数据库相关的SQL文件,一般有两个:schema.sql 和 data.sql。前者为数据库的建表语句,后者为数据库的数据插入语句,插入的数据为测试数据。

2.2.8 doc

存放系统的文本文件,例如系统需求文件,系统操作手册之类的文件,便于开发。

2.2.9 mapper

mybatis.mapper 中的类的映射文件,用于编写操作数据库的SQL语句。详细内容自行系统学习 Mybatis 框架。

2.2.10 application.yml 和 application-dev.yml

均为系统的配置文件。Springboot 默认的配置文件后缀为 properties。建议改为 yml。yml文件相关的语法自行学习。对 application-dev.yml 的解释看这篇:https://www.jb51.net/article/159016.html

2.2.11 generatorConfig

Mybatis逆向工程的配置文件,其作用在于根据数据库中的表自动生成相关的实体类和 mapper类,同时创建 mapper类对应的 mapper.xml 文件。

2.2.12 test

test包,进行单元测试时,在这里写测试代码。


3 IDEA插件

为方便系统的开发,建议安装一下几个插件

3.1 Lombok

通过注释的方式,方便为类中的属性添加 get/set 方法。

3.2 MybatisCodeHelperPro

方便利用 Mybatis 进行系统开发

3.3 Alibaba Java Coding Guidelines

规范代码格式


4 系统实现

这一节开始利用 Springboot 编写 web后台服务。对于 Springboot 的相关的知识我会简要说明,本文只是教有 Java 基础的程序员如何快速开发一个 web后台服务,对于 Springboot 相关的知识请读者自行学习,在这里是说不完的。

4.1 系统配置

4.1.1 配置文件

4.1.1.1 application.yml

对系统进行配置。详情见具体代码

4.1.1.2 application-dev.yml

我在配置文件里主要是写 数据库的连接。这里给出 h2 数据库 和 MySQL数据库的相关配置。注意 MySQL的版本不同,对应的 url 和 driver-class-name 有所区别,自行百度:Springboot 连接版本不同的MySQL数据库

# 数据库连接 h2,根据你自己的使用的数据库修改相关的配置
spring:
  datasource:
    data: classpath:db/data.sql
    schema: classpath:db/schema.sql
    driver-class-name: org.h2.Driver
    url: jdbc:h2:D:\JavaProgram\H2Database/demo;MODE=MySql;DB_CLOSE_DELAY=-1
    username: root
    password: root
    sql-script-encoding: utf-8
  h2:
    console:
      enabled: true
      path: /h2
      settings:
        web-allow-others: true
spring:
  datasource:
    data: classpath:db/data.sql
    schema: classpath:db/schema.sql
   url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
    sql-script-encoding: utf-8
4.1.1.3 pom.xml

给出通用的 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>

  <groupId>com.hubu</groupId>
  <artifactId>work</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>work</name>
  <description>Demo project for Spring Boot</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.8.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <!--JsonObject依赖-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.41</version>
    </dependency>

    <!--swagger2-->
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.8.0</version>
    </dependency>
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger-ui</artifactId>
      <version>2.8.0</version>
    </dependency>

    <!--返回JSON数据 -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.8</version>
    </dependency>

    <!--druid数据库连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.9</version>
    </dependency>

    <!--h2 数据库驱动-->
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.35</version>
    </dependency>

    <!--分页插件pagehelper-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.2.9</version>
    </dependency>

    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.0.1</version>
    </dependency>
    <!--mapper-->
    <dependency>
      <groupId>tk.mybatis</groupId>
      <artifactId>mapper-spring-boot-starter</artifactId>
      <version>2.0.4</version>
    </dependency>

    <!-- mybatis二级缓存整合redis -->
    <dependency>
      <groupId>com.github.liuanxin</groupId>
      <artifactId>mybatis-redis-cache</artifactId>
      <version>1.2.5</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <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>
      <!-- 使用Mybatis逆向工程必须使用的插件 -->
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.6</version>
        <configuration>
          <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
          <overwrite>true</overwrite>
          <verbose>true</verbose>
        </configuration>
        <dependencies>
          <!-- 数据库驱动文件,根据你自己的数据库,改成相关的驱动 -->
          <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
            <version>1.4.199</version>
          </dependency>
        </dependencies>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>
4.1.1.4 Mybatis逆向工程配置文件:generatorConfig
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
    PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
  
  <properties resource="application-dev.yml"/>

    <!-- 本地 jdbc 位置,如果失败用本地jdbc来连接数据库。将下面这一行注释取消改为你电脑上jdbc的路径。-->
    <!--<classPathEntry location="D:/Java/tool/ConnectionDriver/Dm7JdbcDriver17.jar" />-->
    <context id="DB2Tables" targetRuntime="MyBatis3">

        <commentGenerator>
            <!--是否在代码中显示注释,true则没有注释-->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>

        <!--配置数据库连接-->
        <jdbcConnection driverClass="org.h2.Driver"
                        connectionURL="jdbc:h2:D:\JavaProgram\H2Database/demo;MODE=MySql;DB_CLOSE_DELAY=-1"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!--指定java bean生成的位置-->
        <javaModelGenerator targetPackage="com.hubu.work.mybatis.pojo"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!--指定sql映射文件生成的位置-->
        <sqlMapGenerator targetPackage="mapper"  targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!--指定dao接口生成的位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.hubu.work.mybatis.mapper"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!--指定每个表的生成策略-->

        <table tableName="field_value"
               enableCountByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               enableUpdateByExample="false"></table>
        <!-- <table tableName="%" ></table>-->
    </context>
</generatorConfiguration>

完成配置文件的编写之后,使用如下步骤启动 mybatis-generator。双击 4

如果失败自行百度 Mybatis逆向工程。我这个配置文件不是最新的版本,可能会有兼容问题。
在这里插入图片描述


4.1.2 系统配置类

4.1.2.1 Druid

数据库连接池。可不要,相关的配置与 application.yml 相关的配置绑定。详情见具体代码:config/DruidAutoConfig 和 config/DruidProperties

4.1.2.2 Swagger

内置网页显示系统所有的API。便于对系统的API进行测试。相关的知识自行百度。详情见具体代码:config/Swagger2Config

4.1.2.3 webConfig

配置系统的 web 设置。新手不建议进行修改具体的代码。详情见具体代码:config/WebMvcConfig

4.1.2.4 Springboot 启动类

在Springboot 启动类中需要添加 @MapperScan 注解,该注解来自:org.mybatis.spring.annotation.MapperScan

@SpringBootApplication
@MapperScan(value = "com.hubu.work.mybatis.mapper") // 改为自己项目 mapper包 的路径
public class WorkApplication {
  public static void main(String[] args) {
    SpringApplication.run(WorkApplication.class, args);
  }

}

4.2 系统API编写(接口)

以 实体类 UserInfo 为例

系统的API编写遵循从 UserInfoMapper -> UserInfoService -> UserInfoController

注:在我的所有的 mapper类、service类和controller类中,都使用了继承,是因为我使用了tk.mybatis编写系统的底层架构,一般的项目中没有使用 tk.mybatis 也就没有底层,不实现继承。在后续文章中,我均是按照一般的项目进行 API 编写的说明。

参考文章:https://blog.csdn.net/baidu_39298625/article/details/98102453

4.2.1 mapper层

mapper层以下的内容均属于 Mybatis 框架的内容。在此只做简要说明。读者自行系统的学习 Mybatis。

每一个 mapper类 必须添加 @mapper 注解

以 UserInfoMapper 中 findUser() 方法为例。在 UserInfoMapper 中写:方法名,方法返回值,方法的参数

@Mapper
public interface UserInfoMapper {
  /**
   * 查询用户名与密码是否配对
   * @param user:User 对象
   * @return int
   * 1:配对
   * 0:不配对
   */
  int findUser(User user);
}

在 resources / mapper / UserInfoMapper.xml 中,实现该方法,编写该方法对应的 SQL 语句。

id 表示 方法名,resultType 表示 返回值类型
<select id="findUsername" resultType="int">
    select count (*) from user_info
    <where>
        username = #{username}
    </where>
</select>

如果安装了 MybatisCodeHelperPro,在方法旁边会出现小鸟,点击方法旁边的小鸟,就能直接跳转到 UserInfoMapper.xml 中对应的方法,同时该插件还能帮助在 UserInfoMapper.xml 中创建 UserMapper 中的方法。

4.2.2 service 层

每一个 service类 都必须添加 @Service 注解,在类中注入对应的 mapper层的类(@Autowired)以 UserInfoService 为例,自行查看具体代码

service层一般用于实现 mapper 中的相关方法,每一个具体的 service 类其实没什么内容。对比 UserInfoMapper 和 UserInfoService 就可以发现。

注:Springboot中调用其他类中的方式使用 Bean注入 的方式,即使用 @Autowired 注解

@Service
public class UserInfoService {
  @Autowired
  UserInfoMapper userInfoMapper;
  
  public int findUser(User user) {
    return userInfoMapper.findUser(user);
  }
}

4.2.3 controller层

controller层用以实现 系统API。对于系统的每一个功能,都需要在 controller层中进行实现,以转化为API,供前端调用。

每一个 controller类 都需要实现两个注解,注入对应的 service层。以 UserInfoController 为例:

  1. RestController:标注该类为 controller 类
  2. RequestMapping(value = ):写入 value 值注明路径,便于前台调用。
  3. 注入 UserInfoService

注:Springboot中调用其他类中的方式使用 Bean注入 的方式,即使用 @Autowired 注解

在 controller 类中实现每一个方法,都需要添加相应的注解使得该方法变成一个 API接口 供前端调用:

  1. @ApiOperation(value = ):Swagger提供的注解,写入 value 值显示该方法的功能
  2. @PostMapping(value = ):RestController提供的注解,写入 value 值 注明路径,指明该方法为一个 API接口。

注:类似 @PostMapping 这样的注解一共有四个

  1. @PostMapping:当方法用以实现某种功能时,使用该注解。
  2. @GetMapping:当方法用以向前台传输数据时,使用该注解
  3. @PutMapping:当方法用以向数据库插入数据时,使用该注解
  4. @DeleteMapping:当方法用以向数据库中删除数据时,使用该注解

PostMapping 和 GetMapping 的使用情况十分相似,GetMapping 一般用在前台向后台传入少量参数且获取数据的时候使用。多数情况下使用 PostMapping

每个方法在传入参数时,同样需要使用相关的注解

  1. @RequestParam:可设置 默认值,当传入的参数为单个单个的参数时,对每一个传入的参数前加入该注解。 在这里插入图片描述

  2. @RequestBody:当传入的参数是对象时,使用该注解

    // 这也是在 controller类 中实现 API接口的实例 
    @ApiOperation(value = "登陆接口,1:登陆成功,2:该用户名未注册,3:密码错误")
    @PostMapping(value = "login")
    public int login(@RequestBody User user) {
        int count = userInfoService.findUser(user);
        if (count == 1) {
            return 1;
        } else {
            int username = userInfoService.findUsername(user.getUsername());
            if (username == 1) {
                return 3;
            } else {
                return 2;
            }
        }
    }
    

4.2.4 接口测试

4.2.4.1 启动 Swagger

对编写完的接口,使用 Swagger 进行测试。使用 Swagger 之前要进行 Swagger 的配置,具体见上文 系统配置 / 系统配置类 / Swagger

启动项目之后,在浏览器端输入:http://localhost:8888//swagger-ui.html

8888 即 配置文件中 设置 的端口号

打开后效果如下
在这里插入图片描述

在这里插入图片描述

红框中的内容即 上文提到的路径


4.2.4.2 接口测试

以 userInfo / login 接口进行测试

  1. 点击 try it out。在红框中输入测试值
    在这里插入图片描述

  2. 输入测试值后,点击 execute 执行
    在这里插入图片描述

  3. 执行结果如下,URL 显示接口的路径,Response body 表明 执行的结果。在这里插入图片描述

至此,利用 Springboot 开发 web后台服务的流程就全部结束。Springboot本身的内容很多,由于是一个后台框架,按照我这篇文章开始搭建自己的 web后台服务肯定会出现各种各样的异常。学习过程中应保持耐心。多百度,多找资料。也可以在评论区留言,我看到了会回复的。
建议对照我这篇文章,跑我提供的源项目,出现问题自己多琢磨,多查资料。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值