文章目录
前言
关于怎么搭建 SpringBoot 项目,我相信大部分开发者自己都能搭建好,至于我为什么还要写,主要是我自己觉得搭一个项目挺麻烦的,想搞一个基础的模子,以后学习其它的技术就可以直接引用这个模子,写下笔记便于日后回顾和修改,顺便发下博客。
注意:以下项目创建方式以及项目内容完全是根据个人喜好而搭建的,仅具借鉴意义~~
一、简单项目的创建
这里项目的创建,我使用的工具是 IDEA,还有一个很重要的事情就是管理项目,这里我建议项目最好有一个集中的地方管理,所以我创建了一个 my-project
的文件夹专门用于管理自己的项目。
打开 IDEA
工具,点击 File
-> New
-> Project...
创建一个项目
选择 Sring Initializr
(如果你用的是 IDEA 社区版的可能没有这个选项),完善以下资料,然后点击 Next
选择 SpringBoot 版本,点击 Finish
然后一个最简单的 spring-boot 项目就建好了,如果你只是为了创建一个 spring-boot 项目的话,到这里就可以结束了,以下内容很多东西都是按照我个人意愿去编写的,并不具有通用性,但是仍可借鉴使用~~
简单完善一下目录结构
- com.duojiala.mikeboot
- common ------------------------------------公共定义类
- config ----------------------------------------配置类
- controller -----------------------------------控制层
- dao -------------------------------------------dao层
- domain
- annotations --------------------------注解类
- bean -----------------------------------自定义类
- dto --------------------------------------组装对象类
- entity ----------------------------------实体类
- enums ---------------------------------枚举类
- req --------------------------------------请求体
- resp ------------------------------------响应体
- exceptions ------------------------------自定义异常类
- service ------------------------------------服务层
- imp -------------------------------------实现类
- utils -------------------------------------------工具类
PS:以上并非标准,项目结构你可以根据自己的需求或者喜好去设计
二、常用依赖的引入
之前在创建项目的时候其实是可以选择添加依赖的,但是我没有去做,所以如果你按照我上述步骤创建项目的话,pom.xml
文件中只有两个依赖,如下:
接下来就是引入一些常用的依赖,供大家参考:
SpringBoot 项目的启动依赖:如果没有添加该依赖,启动类一运行会直接停止
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
lombok 依赖插件:方便实体类 bean 快速生成 get
set
方法,从而不用手动添加
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
commons-lang3是Apache的Jakarta commons工程下具有一系列公共基础类,Lang组件主要是一些工具类,涉及到数组工具类,字符串工具类,字符工具类,数学方面,时间日期工具类,异常,事件等工具类。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
通用Mapper依赖:是对底层 sql 进行了抽象封装,不需要考虑 sql 怎么写,只需要按照逻辑思维,遵循 tkmybatis 的语法即可实现数据库操作。
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
JDBC驱动包:用 JDBC 连接 MySQL 数据库时必须使用该 jar 包,能够与数据库建立连接、发送 SQL 语句以及处理结果。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
校验参数:就是一个规范,所有实现类必须是线程安全的,提供一些注解,但并不提供实现,可以根据需求去写一些有校验功能的注解。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Fastjson:是一个 Java 语言编写的高性能功能完善的 JSON 库。它采用一种 “假定有序快速匹配” 的算法,把 JSON Parse 的性能提升到极致,是目前 Java 语言中最快的 JSON 库。Fastjson 接口简单易用,已经呗广泛使用在序列化、协议交互、Web 输出、Android 客户端等多种应用场景。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
Spring web依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
mybatis 自动配置依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-autoconfigure</artifactId>
<version>2.1.1</version>
</dependency>
表格依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
添加 mybatis 逆向工程插件,generator 的配置文件这里我放在 /resources/generator
目录下
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
</dependencies>
</plugin>
最后我 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.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.duojiala</groupId>
<artifactId>mike-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mike-boot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-autoconfigure</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.1.5</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
三、常用配置的编写
这里自动创建的项目,配置文件默认是 properties
的文件,这里我改用成 yml
格式的(仅仅是个人习惯的问题)
application.yml
常用配置的编写:
server:
port: 8868
servlet:
context-path: /mike
spring:
application:
name: mike-boot
# 数据库配置
datasource:
url: jdbc:mysql://127.0.0.1:3306/mike?characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
hikari:
username: 'root'
password: 'root'
driver-class-name: 'com.mysql.cj.jdbc.Driver'
mybatis:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
四、逆向工程的使用
之前在常用依赖引入中有引入 mybatis 逆向工程的插件,这里主要就是去编写逆向工程的一些配置文件,以及使用
首先需要在 resources
目录下创建文件夹 com/duojiala/mikeboot/dao
目录(要和你 dao 目录相一致),如果你用 IDEA 创建的话,切记不可直接 com.duojiala.mikeboot.dao
这样创建,因为这样创建的文件夹只是一个名字叫做 com.duojiala.mikeboot.dao
的文件夹,并非多层目录,比如:
用 IDEA 要一个一个创建
在创建一个 generator
的文件夹,该文件夹下面加上两个配置文件 config.properties
和 generatorConfig.xml
,做完以上步骤之后大概是这样的
config.properties
中配置编写:
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mike?useSSL=false&characterEncoding=UTF-8&nullCatalogMeansCurrent=true&serverTimezone=GMT%2B8
jdbc.user=root
jdbc.password=root
javaModelTargetProject=src/main/java
javaModelTargetPackage=com.duojiala.mikeboot.domain.entity
mapperXMLTargetProject=src/main/resources
mapperXMLTargetPackage=com.duojiala.mikeboot.dao
mapperTargetProject=src/main/java
mapperTargetPackage=com.duojiala.mikeboot.dao
这里你要换成你自己的数据库,以及对应的映射关系要以你自己的项目去修改。
generatorConfig.xml
中配置编写:
<!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="generator/config.properties"/>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
<property name="caseSensitive" value="true"/>
</plugin>
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.user}"
password="${jdbc.password}">
</jdbcConnection>
<!--实体类-->
<javaModelGenerator targetPackage="${javaModelTargetPackage}"
targetProject="${javaModelTargetProject}"/>
<!--mapper.xml-->
<sqlMapGenerator targetPackage="${mapperXMLTargetPackage}"
targetProject="${mapperXMLTargetProject}"/>
<!--mapper接口-->
<javaClientGenerator targetPackage="${mapperTargetPackage}"
targetProject="${mapperTargetProject}"
type="XMLMAPPER"/>
<table tableName="%">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
现在我连接的是我本地数据,该库里面只有一张 user 表
现在通过 mybatis 逆向工程生成 user 表对应的 实体类 和 mapper 文件,按如下步骤
执行完可以看见项目中已经生成了所配置数据库中所有表的映射实体类和 Mapper 文件
如果你想要针对某一张表生成对应的映射实体类和 Mapper 文件,可将 generatorConfig.xml
文件中 <table tableName="%">
标签中的 %
改成表明,例如:只生成 user 表的
<table tableName="user">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
同时,还需要在启动类上加上 @MapperScan
的注解扫描 mapper:@MapperScan(basePackages = {"com.duojiala.mikeboot.dao"})
五、常用类的编写
1. 自定义常量类
位于 common
目录下,创建示例类 DefineConstants.java
/**
* 自定义常量类
*/
public class DefineConstants {
/**
* 默认数量
*/
public static final String DEF_NUMBER = "0";
/**
* 默认金额
*/
public static final String DEF_MONEY = "0.00";
}
2. 自定义注解类
位于 annotations
目录下,创建示例类 Describe.java
/**
* 自定义描述注解
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//@Constraint(validatedBy = EnumParamCheck.DecimalParamCheckValidator.class)
public @interface Describe {
String desc();
}
3. 自定义枚举类
位于 enums
目录下,创建性别枚举类 GenderEnum.java
/**
* 性别枚举
*/
@Getter
@AllArgsConstructor
public enum GenderEnum {
WOMAN(0,"女"),
MAN(1,"男")
;
private final int type;
private final String desc;
public static GenderEnum getGenderEnum(int type) {
return Stream.of(values()).filter(value -> value.getType()==type).findFirst().orElse(null);
}
public static String getDescByType(int type) {
GenderEnum genderEnum = getGenderEnum(type);
if (genderEnum==null) return null;
return genderEnum.getDesc();
}
}
位于 enums
目录下,再创建一个自定义异常枚举 ExceptionEnum.java
/**
* 自定义异常枚举
*/
@AllArgsConstructor
@Getter
@ToString
public enum ExceptionEnum {
BAD_REQUEST(301, "错误的请求"),
NOT_FIND(302,"未找到对应数据")
;
private final int code;
private final String msg;
}
4. 自定义异常类
位于 exceptions
目录下,创建自定义公共异常 CommonException.java
public class CommonException extends RuntimeException{
private ExceptionEnum exceptionEnum;
public CommonException(ExceptionEnum exceptionEnum) {
super(exceptionEnum.getMsg());
this.exceptionEnum = exceptionEnum;
}
public void setExceptionEnum(ExceptionEnum exceptionEnum) {
this.exceptionEnum = exceptionEnum;
}
public ExceptionEnum getExceptionEnum() {
return exceptionEnum;
}
@Override
public String getMessage() {
return this.exceptionEnum.getMsg();
}
}
5. 通用响应对象
位于 dto
目录下,创建一个通用的响应对象 ResponseBean.java
/**
* 通用响应对象
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@Slf4j
public class ResponseBean {
private int code;
private String msg;
private Object data;
public static int SUCCESS_CODE = 200;
public static int ERROR_CODE = 300;
public static String SUCCESS_MSG = "Success";
public static String ERROR_MSG = "Error";
public static ResponseBean success() {
return ResponseBean.builder()
.code(SUCCESS_CODE)
.msg(SUCCESS_MSG)
.build();
}
public static ResponseBean success(Object data) {
return ResponseBean.builder()
.code(SUCCESS_CODE)
.msg(SUCCESS_MSG)
.data(data)
.build();
}
public static ResponseBean error() {
return ResponseBean.builder()
.code(ERROR_CODE)
.msg(ERROR_MSG)
.build();
}
public static ResponseBean error(int code, String msg) {
return ResponseBean.builder()
.code(code)
.msg(msg)
.build();
}
}
6. 简单接口编写
请求体类,放在 req
目录下,创建 IdReq.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class IdReq {
private String id;
}
响应体类,放在 resp
目录下,创建 UserInfoResp.java
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserInfoResp {
private String id;//用户id
private String name;//用户名称
private String birthday;//用户生日
private String gender;//用户性别
}
Controller 类,位于 controller
目录下,创建 UserController.java
@Slf4j
@RestController
@RequestMapping(value = "/user")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@CrossOrigin(origins = "*", methods = {RequestMethod.POST, RequestMethod.GET})
public class UserController {
private final UserService userService;
@PostMapping(value = "/query-user-info")
public ResponseBean queryUserInfo(@RequestBody @Validated IdReq req) {
return ResponseBean.success(userService.queryUserInfo(req));
}
}
Service 类,位于 service
目录下,创建 UserService.java
public interface UserService {
UserInfoResp queryUserInfo(IdReq req);
}
Service 实现类,位于 impl
目录下,创建 UserServiceImpl.java
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
@Override
public UserInfoResp queryUserInfo(IdReq req) {
User user = userMapper.selectByPrimaryKey(req.getId());
if (user == null) {
throw new CommonException(ExceptionEnum.NOT_FIND);
}
return UserInfoResp.builder()
.id(user.getId().toString())
.name(user.getName())
.birthday(user.getBirthday())
.gender(GenderEnum.getDescByType(user.getGender()))
.build();
}
}
一个根据 id 查询用户的简单方法就写完了,postman 测试正常
7. 常用的工具类
位于 utils
目录下,这里我复制了些我常用的工具类
- CommonUtil ---------------------------------------- 通用工具类
- DateUtil ---------------------------------------------- 时间工具类
- EnumUtil -------------------------------------------- 枚举工具类
- PageHelperUtil ------------------------------------ 分页工具类
- PureNetUtil ----------------------------------------- 网络访问工具类
- StringTool ------------------------------------------- 字符串工具类
六、网盘下载
以下是我搭建这个基础 SpringBoot 项目的网盘下载链接:
链接:百度网盘
提取码:w7yo