Spring Boot:Idea從零開始初始化後臺項目的教程
官方提供瞭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 項目結構
完成以上配置及案例後,項目結構如下圖:
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot詳解如何整合Redis緩存驗證碼
- springboot使用redis的詳細步驟
- springboot整合redis實現發送郵箱並驗證
- spring使用RedisTemplate操作Redis數據庫
- 為Java項目添加Redis緩存的方法