本文将展示利用 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 为例:
- RestController:标注该类为 controller 类
- RequestMapping(value = ):写入 value 值注明路径,便于前台调用。
- 注入 UserInfoService
注:Springboot中调用其他类中的方式使用 Bean注入 的方式,即使用 @Autowired 注解
在 controller 类中实现每一个方法,都需要添加相应的注解使得该方法变成一个 API接口 供前端调用:
- @ApiOperation(value = ):Swagger提供的注解,写入 value 值显示该方法的功能
- @PostMapping(value = ):RestController提供的注解,写入 value 值 注明路径,指明该方法为一个 API接口。
注:类似 @PostMapping 这样的注解一共有四个
- @PostMapping:当方法用以实现某种功能时,使用该注解。
- @GetMapping:当方法用以向前台传输数据时,使用该注解
- @PutMapping:当方法用以向数据库插入数据时,使用该注解
- @DeleteMapping:当方法用以向数据库中删除数据时,使用该注解
PostMapping 和 GetMapping 的使用情况十分相似,GetMapping 一般用在前台向后台传入少量参数且获取数据的时候使用。多数情况下使用 PostMapping
每个方法在传入参数时,同样需要使用相关的注解
-
@RequestParam:可设置 默认值,当传入的参数为单个单个的参数时,对每一个传入的参数前加入该注解。
-
@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 接口进行测试
-
点击 try it out。在红框中输入测试值
-
输入测试值后,点击 execute 执行
-
执行结果如下,URL 显示接口的路径,Response body 表明 执行的结果。
至此,利用 Springboot 开发 web后台服务的流程就全部结束。Springboot本身的内容很多,由于是一个后台框架,按照我这篇文章开始搭建自己的 web后台服务肯定会出现各种各样的异常。学习过程中应保持耐心。多百度,多找资料。也可以在评论区留言,我看到了会回复的。
建议对照我这篇文章,跑我提供的源项目,出现问题自己多琢磨,多查资料。