Spring Boot:Idea从零开始初始化后台项目的教程 目录 1 创建项目 1.1 填写项目基本信息 1.2 选择项目集成功能 2 项目基础配置 2.1 gradle文件配置 2.2 环境文件配置 2.2.1 Logback配置文件 2.2.2 MyBatis配置文件 3 简单案例 3.1 Redis案例 3.2 MySQL案例 3.2.1 JPA方式
目录
- 1 创建项目
- 1.1 填写项目基本信息
- 1.2 选择项目集成功能
- 2 项目基础配置
- 2.1 gradle文件配置
- 2.2 环境文件配置
- 2.2.1 Logback配置文件
- 2.2.2 MyBatis配置文件
- 3 简单案例
- 3.1 Redis案例
- 3.2 MySQL案例
- 3.2.1 JPA方式
- 3.2.2 MyBatis方式
- 3.3 控制器完整代码
- 4 健康监测
- 5 项目结构
官方提供了Springboot初始化工具可直接在线生成项目文件,然后下载并导入开发工具中 。这里记录通过Mac版 IntelliJ IDEA 2019.3.3 (Ultimate Edition)创建Springboot后台项目的过程,当前Springboot稳定版本为2.2.6。
下面的步骤可看做是创建Springboot后台项目模板,也可以当做个是个Helloworld,主要实现以下功能:
- 集成MySQL,通过SpringData JPA和MyBatis两种方式操作数据库
- 集成Redis内存数据库
- 配置Logback
- 开启项目健康监测
如需集成其他功能,可在此基础上添加。上诉MySQL和Redis使用的是《Docker案例:搭建MySQL数据库服务》和《Docker案例:搭建Redis服务》创建的docker容器。
1 创建项目
1.1 填写项目基本信息
打开Idea创建项目,如下图:
1.2 选择项目集成功能
完成基本信息配置,在Web,SQL,NoSQL,Ops选项中,选择对应的模块依赖,最终选择如图以下几项:
Spring Web
用于提供web相关功能Spring Data JPA
用于提供数据库相关操作MyBatis Framework
用于通过MyBatis操作数据库Spring Data Redis
用于提供Redis相关功能Spring Boot Actuator
用于提供应用的健康监测功能
设置完成后,点击下一步,Idea开始初始化项目文件。
2 项目基础配置
通过上面步骤,已生成项目结构文件,等待开发环境自动构建好依赖库后可继续后续的工作。
2.1 gradle文件配置
当前项目使用gradle管理项目依赖,默认情况下,使用官方的依赖库,国内访问较慢,可替换为阿里云仓库。在build.gradle文件的repositories节点下添加阿里云仓库访问地址,设置完成后如下
repositories {
//使用阿里云仓库,提高国内依赖库下载速度
maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
mavenCentral()
}
另外,添加其它常用依赖库,最终依赖包如下
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.2'
implementation 'com.alibaba:fastjson:1.2.68'
implementation 'org.apache.commons:commons-lang3:3.10'
//数据库配置的日志类com.mysql.cj.log.Slf4JLogger在这个包中
runtime('mysql:mysql-connector-java')
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
2.2 环境文件配置
官方初始化器默认会在resources资源文件夹下生成一个application.properties文件,这里调整一下配置文件结构。在resources资源文件夹下创建config文件夹,移动application.properties文件到config文件夹下,同时在config文件夹下创建application-dev.properties文件和application-prod.properties文件,分别对应开发环境和线上环境的配置,可根据需要增加其它环境配置文件,文件格式为application-环境名称.properties。
最终application.properties文件内容如下
#默认启动dev环境
spring.profiles.active=dev
#调整web后台服务端口为9080,不设置默认为8080
server.port=9080
#mybatis配置文件地址
mybatis.config-location=classpath:mybatis/mybatis-config.xml
#mybatis mapper文件地址
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
application-dev.properties文件内容如下
#mysql数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/crane?autoReconnect=true&characterEncoding=UTF-8&useSSL=false&logger=com.mysql.cj.log.Slf4JLogger&profileSQL=true&maxQuerySizeToLog=8192
#数据库登录名,docker镜像中的数据库
spring.datasource.username=root
#数据库密码
spring.datasource.password=crane
#本机docker镜像中的redis
spring.redis.host=127.0.0.1
#当前环境下日志配置 输出到控制台
logging.config=classpath:logback-dev.xml
#启用所有类型的健康监控
management.endpoints.web.exposure.include=*
application-prod.properties文件内容如下(目前和dev环境只对日志文件做了区分,可根据实际需要调整)
#mysql数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/crane?autoReconnect=true&characterEncoding=UTF-8&useSSL=false&logger=com.mysql.cj.log.Slf4JLogger&profileSQL=true&maxQuerySizeToLog=8192
#数据库登录名,docker镜像中的数据库
spring.datasource.username=root
#数据库密码
spring.datasource.password=crane
#本机docker镜像中的redis
spring.redis.host=127.0.0.1
#当前环境下日志配置 输出到控制台
logging.config=classpath:logback-prod.xml
#启用所有类型的健康监控
management.endpoints.web.exposure.include=*
注意:配置数据库链接spring.datasource.url时需要注意,当前项目引用的mysql:mysql-connector-java为8.0.19版本,MySQL日志打印类Slf4JLogger类的路径为com.mysql.cj.log.Slf4JLogger,较老版本在com.mysql.jdbc.log.Slf4JLogger路径下。
2.2.1 Logback配置文件
dev环境对应logback配置文件logback-dev.xml内容如下,将日志输出到控制台。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%yellow([%date{yyyy-MM-dd HH:mm:ss.SSS}]) %highlight([%-5level]) %cyan([%thread])
- %msg [%logger{1}] \(%file:%line\) %n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
prod环境对应logback配置文件logback-prod.xml内容如下,将日志输出到文件。
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/hbackend.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>
log/hbackend-%d{yyyy-MM-dd}.log
</FileNamePattern>
</rollingPolicy>
<encoder>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] - %msg [%logger{1}]
\(%file:%line\) %n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE"/>
</root>
</configuration>
2.2.2 MyBatis配置文件
mybatis-config.xml文件内容如下,目前没有任何配置,全部使用默认配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
</typeAliases>
</configuration>
3 简单案例
当前案例实现基础的Redis和MySQL操作,因为案例是模拟后端项目搭建过程,不涉及前端UI展示,所以一些接口使用Postman来测试可用性。项目源文件根文件夹下创建控制器类CommonController
,用于为web请求提供数据响应,并设置控制器访问地址,如下
@RestController
@RequestMapping("/common")
public class CommonController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
}
创建HResponse类,用于构造请求的响应结果,内容如下
public class HResponse {
/**
* 请求结果的状态
*/
private int status;
private String description;
private Object data;
public HResponse() {
}
public HResponse(int status, String description, Object data) {
this.status = status;
this.description = description;
this.data = data;
}
public static HResponse success() {
return new HResponse(200, "操作成功", null);
}
public static HResponse success(String description) {
return new HResponse(200, description, null);
}
public static HResponse success(Object data) {
return new HResponse(200, "success", data);
}
public static HResponse success(String description, Object data) {
return new HResponse(200, description, data);
}
public static HResponse error(String description) {
return new HResponse(400, description, null);
}
public static HResponse error(String description, Object data) {
return new HResponse(400, description, data);
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
3.1 Redis案例
使用StringRedisTemplate对Redis进行基本操作,这里简单提供查询Redis的key值和设置Redis的key值两个操作,在CommonController中添加代码如下
private final StringRedisTemplate redisTemplate;
private final SqlSession sqlSession;
public CommonController(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@PostMapping("/getRedisValue")
public HResponse getRedisValue(String key) {
this.logger.info("请求获取redis key为:{} 的值", key);
return HResponse.success(new JSONObject().fluentPut("key", key).fluentPut("value", this.redisTemplate.opsForValue().get(key)));
}
@PostMapping("/setRedisValue")
public HResponse getRedisValue(String key, String value) {
if (StringUtils.isBlank(key)) {
return HResponse.error("键 不能为空");
}
if (StringUtils.isBlank(value)) {
return HResponse.error("值 不能为空");
}
this.logger.info("请求设置redis key为:{} 的值为 {}", key, value);
this.redisTemplate.opsForValue().set(key.trim(), value.trim());
return HResponse.success();
}
启动redis的docker容器并运行当前案例,使用Postman发送请求设置和查询redis中对应的key值,请求响应如下图
3.2 MySQL案例
简单介绍两种从MySQL查询数据的案例,JPA方式和MyBatis方式。先启动好MySQL的docker容器,然后创建表h_company并插入一条数据,最终数据表结果如下图:
3.2.1 JPA方式
构造HCompany数据库映射类和对应的数据库表访问接口CompanyRepository,内容如下:
@Entity
@Table(name = "h_company")
@Where(clause = "id > 0")
public class HCompany {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String shortName;
private String address;
private String tel;
private String remark;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
@Repository
@Where(clause = "id > 0")
public interface CompanyRepository extends PagingAndSortingRepository<HCompany, Integer>, JpaRepository<HCompany, Integer> {
}
在控制器CommonController中添加使用CompanyRepository查询数据库的方法:
@PostMapping("/getAllCompany")
public HResponse getAllCompany() {
return HResponse.success(this.companyRepository.findAll());
}
使用Postman调用查询,响应如下
3.2.2 MyBatis方式
使用SqlSession接口访问数据库,创建company.xmlmapper文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="company">
<select id="getAll" resultType="java.util.Map">
select * from h_company
</select>
</mapper>
控制器CommonController中添加通过MyBatis获取数据的方法,如下
@PostMapping("/getAllCompanyByMybatis")
public HResponse getAllCompanyByMybatis() {
return HResponse.success(this.sqlSession.selectList("company.getAll"));
}
重新启动项目,然后通过Postman访问,响应如下:
3.3 控制器完整代码
完成以上步骤后,控制器CommonController完整内容如下:
@RestController
@RequestMapping("/common")
public class CommonController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private final StringRedisTemplate redisTemplate;
private final CompanyRepository companyRepository;
private final SqlSession sqlSession;
public CommonController(StringRedisTemplate redisTemplate, CompanyRepository companyRepository, SqlSession sqlSession) {
this.redisTemplate = redisTemplate;
this.companyRepository = companyRepository;
this.sqlSession = sqlSession;
}
@PostMapping("/getRedisValue")
public HResponse getRedisValue(String key) {
this.logger.info("请求获取redis key为:{} 的值", key);
return HResponse.success(new JSONObject().fluentPut("key", key).fluentPut("value", this.redisTemplate.opsForValue().get(key)));
}
@PostMapping("/setRedisValue")
public HResponse getRedisValue(String key, String value) {
if (StringUtils.isBlank(key)) {
return HResponse.error("键 不能为空");
}
if (StringUtils.isBlank(value)) {
return HResponse.error("值 不能为空");
}
this.logger.info("请求设置redis key为:{} 的值为 {}", key, value);
this.redisTemplate.opsForValue().set(key.trim(), value.trim());
return HResponse.success();
}
@PostMapping("/getAllCompany")
public HResponse getAllCompany() {
return HResponse.success(this.companyRepository.findAll());
}
@PostMapping("/getAllCompanyByMybatis")
public HResponse getAllCompanyByMybatis() {
return HResponse.success(this.sqlSession.selectList("company.getAll"));
}
}
4 健康监测
案例启用了完整的项目监测,可通过http://localhost:9080/actuator查看,每个监测项都对应相应的查看链接,如下图。
5 项目结构
完成以上配置及案例后,项目结构如下图:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
本文标题为:Spring Boot:Idea从零开始初始化后台项目的教程
基础教程推荐
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- Java实现查找文件和替换文件内容 2023-04-06
- Java并发编程进阶之线程控制篇 2023-03-07
- java基础知识之FileInputStream流的使用 2023-08-11
- Java文件管理操作的知识点整理 2023-05-19
- Java实现线程插队的示例代码 2022-09-03
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- springboot自定义starter方法及注解实例 2023-03-31
- Java数据结构之对象比较详解 2023-03-07
- java实现多人聊天系统 2023-05-19