准備工作:
- Java開發環境
- 已安裝 springboot 插件(STS)的 Eclipse
- MySQL服務
一、 創建 springboot 項目
1. 打開Eclipse --> 左上角 File --> New --> Other ,到如下界面
如果沒有 Spring Starter Project 這個選項,說明 Eclipse 的 springboot 插件沒安裝成功。本人win10系統,用 Eclipse 4.10、4.12 版本,
各嘗試過在線安裝、離線安裝,都沒有安裝成功(有Spring/Spring Boot選項,但是沒有Spring Starter Project)。最后使用Eclipse 4.7版
本才成功裝上,找遍網上都沒發現有人遇到過這個問題,真是服啦。
2. 選擇Spring Starter Project ,點擊 Next,進入如下界面
3. 填寫項目名稱--Name選項,我這里改為 SpringBootDemo;
填寫包名--Package,我這里填寫的是com.delav,其他的可以默認,點擊 Next,進入如下界面
4. 勾選 Spring Web Starter 復選框,點擊 Finish,可以看到項目的目錄如下(忽略 log 目錄)
如果發現 pom.xml 有個紅叉,打開 pom.xml 文件后,紅叉提示在第一行。這是 maven 的版本導致的,
解決方法是指定 maven 的版本,在 pom.xml 中找到如下這個標簽
<properties> <java.version>1.8</java.version> </properties>
添加一行來指定版本,添加后如下
<properties> <maven-jar-plugin.version>3.0.0</maven-jar-plugin.version> <java.version>1.8</java.version> </properties>
然后紅叉就沒了,不然項目運行不了。
好了,一個 springboot 空項目創建好了,接下來就是在這個空的項目中填充東西進去了。
二、 完善詳細目錄結構與編碼
如下圖,在 com.delav (包)下,創建四個子包 controller、entity、mapper、service.
controller:接收請求
entity:存放 Java Bean 類
mapper:關聯 SQL 語句
service:處理業務邏輯
純屬個人理解,處理流程:controller --> service --> mapper (entity的bean類用來存放和獲取數據)
1.創建數據表
一個項目的第一步,都應該是先設計數據庫,先設計一個表 user。
create table user( id int(16) not null auto_increment ,userName varchar(32) not null ,passWord varchar(32) not null ,realName varchar(64) ,primary key(id) ) engine=myisam default charset=utf8;
然后插入幾條數據
insert into user (userName,passWord,realName) values ("aaa","111","admin")
....
最后表的數據是這樣,它位於名叫 'java' 的數據庫中
2.修改配置文件
修改 pom.xml。在這個配置文件中引入 mybatis、mysql 等依賴包,整個文件全部配置如下
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.delav</groupId> <artifactId>SpringBootDemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>SpringBootDemo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <maven-jar-plugin.version>3.0.0</maven-jar-plugin.version> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
修改 resource 目錄下 application.properties 文件。由於現在流行使用 .yml 來配置,就嘗試一下這種配置,刪除 application.properties,
並新建一個 application.yml 和 application-dev.yml 文件。
application.yml文件內容如下。通過修改 active 的值可配多套環境,這里表示使用 application-dev.yml 的配置。如果再新建一個 application-test.yml ,
再把 dev 改為 test ,就表示使用 application-test.yml 的配置。
spring:
profiles:
active: dev
application-dev.yml文件的內容如下,四個大塊分別配置了端口號、MySQL數據庫信息、mybatis信息、日志信息
server: port: 8080 spring: datasource: username: root password: 666666 url: jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:com/delav/mapper/*Mapper.xml type-aliases-package: com.delav.entity logging: pattern: console: "%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n" file: "%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n" file: log/info.log level: com: delav: info
3. 在 com.delav.entity 包下新建 User.java,內容如下
package com.delav.entity; /** * @author Delav * @date 2019/06/27 */ public class User { private Integer id; private String userName; private String passWord; private String realName; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } }
4.在 com.delav.mapper包下新建 UserMapper.java 和 UserMapper.xml
UserMapper.java
package com.delav.mapper; import com.delav.entity.User; //import com.delav.mapper.IBaseMapper; public abstract interface UserMapper { public abstract int InsertUser(User params); public abstract User SelectUser(int id); }
UserMapper.xml
<?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="com.delav.mapper.UserMapper"> <resultMap id="BaseResultMap" type="com.delav.entity.User"> <result column="id" jdbcType="INTEGER" property="id" /> <result column="userName" jdbcType="VARCHAR" property="userName" /> <result column="passWord" jdbcType="VARCHAR" property="passWord" /> <result column="realName" jdbcType="VARCHAR" property="realName" /> </resultMap> <select id="SelectUser" resultType="com.delav.entity.User"> select * from user where id = #{id} </select> <insert id="InsertUser" parameterType="com.delav.entity.User" useGeneratedKeys="true" keyProperty="id"> insert into user (userName,passWord,realName) values (#{userName},#{passWord},#{realName}) </insert> </mapper>
5. 在 com.delav.service 包下新建 UserService.java,內容如下
package com.delav.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.delav.entity.User; import com.delav.mapper.UserMapper; /** * @author Delav * @date 2019/06/27 */ @Service public class UserService { // 日志器 private static final Logger logger = LoggerFactory.getLogger(UserService.class); @Autowired UserMapper userMapper; public String Sel(int id) { logger.info("開始查詢數據"); User user = userMapper.SelectUser(id); String result = "{" + "id=" + user.getId().toString() + ", userName='" + user.getUserName() + '\'' + ", passWord='" + user.getPassWord() + '\'' + ", realName='" + user.getRealName() + '\'' + '}'; return result; } public int Ins(User params) { logger.info("開始提交數據"); Integer result = userMapper.InsertUser(params); //能獲取插入的id是因為UserMapper.xml的insert語句新增了useGeneratedKeys和keyProperty參數 Integer insertId = params.getId(); System.out.println("插入數據的ID: " + insertId); System.out.println("insert結果: " + result); // insert返回結果為 1,表示插入了一條數據 if (result == 1) { return insertId; } else { return 0; } } }
6. 在 com.delav.controller包下新建 UserController.java,內容如下
package com.delav.controller; import java.io.IOException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestBody; import com.delav.service.UserService; import com.delav.entity.User; /** * @author Delav * @date 2019/06/27 */ @RestController @RequestMapping("/testSpring") public class UserController { private static final Logger logger = LoggerFactory.getLogger(UserController.class); @Autowired private UserService userService; @RequestMapping(value= {"getUser/{id}"}, method={org.springframework.web.bind.annotation.RequestMethod.GET}) public String GetUser(@PathVariable int id) { logger.info("查詢數據ID為: " + id); String result = userService.Sel(id); logger.info("查詢數據成功"); return result; } @RequestMapping(value= {"postUser"}, method={org.springframework.web.bind.annotation.RequestMethod.POST}) public String PostUser(@RequestBody String params) throws IOException { ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(params); logger.info("解析數據成功"); User user = new User(); // user.setId(rootNode.path("id").asInt()); user.setUserName(rootNode.path("userName").asText()); user.setPassWord(rootNode.path("passWord").asText()); user.setRealName(rootNode.path("realName").asText()); logger.info("數據轉為實體bean成功"); Integer result = userService.Ins(user); if (result != 0) { logger.info("數據入庫成功"); return "Commit Success"; } else { logger.info("數據入庫失敗"); return "Commit Fail"; } } }
7. 在 com.delav包下的啟動文件SpringBootDemoApplication.java,添加一個注解,讓項目啟動的時候掃描 mapper 的路徑,內容如下
package com.delav; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan(basePackages="com.delav.mapper") public class SpringBootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class, args); } }
添加了 @MapperScan(basePackages="com.delav.mapper")
整個項目已經完成了。現在可以啟動項目,然后測試一下它的兩個接口。我這里使用的是 Postman 來測試
啟動: 選中該項目 --> 單擊右鍵 --> Run As --> Spring Boot App,啟動成功如下。輸出格式這樣是因為在application-dev.yml的日志信息配置中改了輸出格式
Postman測試 get 請求如下:
控制台輸出:
Postman測試 post 請求如下:
控制台輸出:
看下數據庫是否新增了這條數據,確實新增了記錄
三、單元測試
1. 編寫單元測試代碼
沒有裝有Postman,那我們就寫個單元測試來測一下
進入 src 的 test 目錄,找到 com.delav 下的 SpringBootDemoApplicationTests.java,編寫內容如下
package com.delav; import static org.hamcrest.CoreMatchers.equalTo; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import java.util.HashMap; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBootDemoApplicationTests { @Autowired private WebApplicationContext wac; // 模擬對Controller發起請求的對象 private MockMvc mvc; @Before public void Setup() throws Exception { // mvc = MockMvcBuilders.standaloneSetup(new UserController()).build(); mvc = MockMvcBuilders.webAppContextSetup(wac).build(); } @Test public void getTest() throws Exception { HashMap<String, String> result = new HashMap<String, String>(); // 請求ID和對應的預期結果 result.put("1", "{id=1, userName='aaa', passWord='111', realName='admin'}"); result.put("2", "{id=2, userName='bbb', passWord='222', realName='admin'}"); result.put("3", "{id=3, userName='ccc', passWord='333', realName='admin'}"); result.put("5", "{id=5, userName='tom', passWord='999', realName='delav'}"); for (String key: result.keySet()) { // 執行請求 String path ="/testSpring/getUser/" + key; System.out.println("請求URL: " + path); mvc.perform(MockMvcRequestBuilders.get(path) .contentType(MediaType.APPLICATION_JSON_UTF8) .accept(MediaType.APPLICATION_JSON) ) // 響應狀態 .andExpect(status().isOk()) // 響應內容 .andExpect(content().string(equalTo(result.get(key)))); } } @Test public void postTest() throws Exception { String params = "{\"userName\":\"tom\", \"passWord\":\"999\", \"realName\":\"333\"}"; mvc.perform(MockMvcRequestBuilders.post("/testSpring/postUser") .accept(MediaType.APPLICATION_JSON_UTF8) .content(params) ) .andExpect(status().isOk()) .andExpect(content().string(equalTo("Commit Success"))); } }
2. 運行測試
選中該項目 --> 單擊右鍵 --> Run As --> JUnit Test ,結果如下
該Demo的github地址:https://github.com/delav/SpringBootDemo
這個項目會不斷更新,當你閱讀該文章時,可能會跟該文章不一樣。