1. 程式人生 > >Spring全家桶系列–SpringBoot漸入佳境

Spring全家桶系列–SpringBoot漸入佳境

1.Lombok外掛

對於開發人員來說,我要解釋這個什麼意思,你肯定也是一知半解,直接來程式碼解釋吧

歡迎工作一到八年的Java工程師朋友們加入Java高階交流群:854630135

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有直播平臺和講師直接交流噢

哦對了,喜歡就別忘了關注一下哦~

 

1.1 程式碼演示

package com.example.entity; public class Area { private Integer id; private Integer postalcode; private String address; private Integer type; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getPostalcode() { return postalcode; } public void setPostalcode(Integer postalcode) { this.postalcode = postalcode; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address == null ? null : address.trim(); } public Integer getType() { return type; } public void setType(Integer type) { this.type = type; } }

使用了Lombok之後

package com.example.entity; import lombok.Data; @Data public class Area { private Integer id; private Integer postalcode; private String address; private Integer type; }

以上兩者的效果是相同的,現在我們知道它是幹嘛的了,下面開始使用吧

1.2 安裝Lombok

在Intellij IDEA中安裝lombok外掛

Spring全家桶系列--SpringBoot漸入佳境

安裝完重啟IDEA

Spring全家桶系列--SpringBoot漸入佳境

開啟設定找到上述並勾選,然後在build.gradle檔案中增加

//讓gradle具有內建的compileOnly範圍,可用於告訴gradle僅在編譯期間新增lombok compileOnly 'org.projectlombok:lombok:1.18.4'

重新整理Gradle之後就可以了

Spring全家桶系列--SpringBoot漸入佳境

然後隨意找個測試類,例如如下

package com.example.demo; import com.example.entity.Area; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests { @Test public void contextLoads() { Area area=new Area(); //這裡可以有get方法證明就ok 可以使用了 area.getType(); } }

2.PageHelper分頁外掛

萌新:小哥,我很苦惱分頁這個功能怎麼辦?

小哥:那不是可以寫好一個邏輯直接複製嗎?

萌新:那也需要很多行程式碼,導致了需要在mapper以及業務層做很多無用功

小哥:哈哈,那我來告訴你一款分頁外掛,解決你的困擾

首先,在build.gradle中引入依賴

/** buildscript中的宣告是gradle指令碼自身需要使用的資源。 * 可以宣告的資源包括依賴項、第三方外掛、maven倉庫地址等 */ buildscript { ext { springBootVersion = '2.0.1.RELEASE' mysqlVersion = '5.1.39' } repositories { //使用國內源下載依賴 maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } // 應用Java外掛 apply plugin: 'java' //讓工程支援IDEA的匯入 apply plugin: 'idea' apply plugin: 'org.springframework.boot' group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8 //build.gradle檔案中直接宣告的依賴項、倉庫地址等資訊是專案自身需要的資源。 repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } mavenCentral() } /** * 在gradle裡,對依賴的定義有6種 * compile, runtime, testCompile, testRuntime, providedCompile,providedRuntime * compile:需要引用這個庫才能進行編譯工作 * testRuntime : 測試依賴範圍 * 其他的瞭解:http://shmilyaw-hotmail-com.iteye.com/blog/2345439 */ dependencies { compile('org.springframework.boot:spring-boot-starter-web:2.0.1.RELEASE') compile('com.alibaba:druid:1.0.29') testCompile('org.springframework.boot:spring-boot-starter-test:2.0.1.RELEASE') //這裡的版本可以在上述定義 compile 'mysql:mysql-connector-java:5.1.39' compile 'org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2' //讓gradle具有內建的compileOnly範圍,可用於告訴gradle僅在編譯期間新增lombok compileOnly 'org.projectlombok:lombok:1.18.4' //分頁外掛 compile 'com.github.pagehelper:pagehelper-spring-boot-starter:1.2.10' }

這裡同時也將SpringBoot升到了2.0,具體的新功能研究後會總結一下的

pagehelper這個外掛估計和Spring1.5.x的版本有相容性問題

上面的配置都是我測試好的,直接替換然後重新重新整理Gradle

上篇的自動生成的mapper.xml檔案中無查詢全部的方法,這裡補上一下

<select id="selectAreaAll" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from area </select>

然後在dao藉口插入方法介面 AreaMapper.java

package com.example.dao; import com.example.entity.Area; import java.util.List; public interface AreaMapper { int deleteByPrimaryKey(Integer id); int insert(Area record); int insertSelective(Area record); Area selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Area record); int updateByPrimaryKey(Area record); /** * 查詢全部 * @return */ List<Area> selectAreaAll(); }

AreaService.java

package com.example.service; import com.example.entity.Area; import java.util.List; /** * 這裡給dao層的程式碼拷貝過來先使用 * created by cfa 2018-11-08 下午 9:56 **/ public interface AreaService { int deleteByPrimaryKey(Integer id); int insert(Area record); int insertSelective(Area record); Area selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Area record); int updateByPrimaryKey(Area record); List<Area> selectAreaAll(Integer pageNum,Integer pageSize); }

上述介面的實現類加上 AreaServiceImpl.java

/** * 分頁核心程式碼 * @param pageNum * @param pageSize * @return */ @Override public List<Area> selectAreaAll(Integer pageNum,Integer pageSize) { //這個要在你的查詢之前加哦 PageHelper.startPage(pageNum,pageSize); //這裡直接查詢全部就行了,分頁外掛會替你做分頁,也無需擔心效能問題,會自動補上limit的 List<Area> areaList=areaMapper.selectAreaAll(); return areaList; }

控制層呼叫 AreaController.java

package com.example.controller; import com.example.entity.Area; import com.example.service.AreaService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("area") public class AreaController { private final AreaService areaService; @Autowired public AreaController(AreaService areaService) { this.areaService = areaService; } /** * 這裡的@RequestParam(name = "pagesize",required = false,defaultValue = "10") * -name 為傳輸時為接受key為pagesize的引數 * -required 為是否為必須傳輸的引數 * -default 就是如果沒有接收到值 就給予預設值 * @param pageNum * @param pageSize * @return */ @RequestMapping("query") public List<Area> areaList(@RequestParam(name = "pagenum",required = false,defaultValue = "1") Integer pageNum, @RequestParam(name = "pagesize",required = false,defaultValue = "10") Integer pageSize){ return areaService.selectAreaAll(pageNum,pageSize); } }

然後在IDEA中啟動DemoApplication啟動類

用postman進行測試

 

Spring全家桶系列--SpringBoot漸入佳境

 

到這裡已經可以了

如果你的有問題,在我github有程式碼,或者百度下錯誤,因為每個人電腦的java版本不同,環境不同

3.API介面返回統一化

現在的很多專案都是前後端分離的專案,所以後臺人員返回的引數參差不齊,每次對接都需要去交流一下,造成開發效率很低。

例如,一個操作更新成功,後臺甲可能就返回給前臺一個1,而乙返回一個Map格式,假如批量更新呢,返回的有時候不止是1了,所以介面返回統一化很重要。

萌新:那小哥,我又不是負責人,怎麼統一呢

小哥:最少你自己用了之後返回的API的格式是固定的,前臺很好拿資料

萌新:好的,好的開發規範,人人有責

PageResultBean.java

package com.example.beans; import com.github.pagehelper.PageInfo; import lombok.Getter; import java.io.Serializable; /* * description : 分頁API統一返回的bean * @return * @time 2018-10-15 下午 9:29 根據曉風輕的ResultBean修改來的 **/ @Getter public class PageResultBean<T> extends ResultBean<T> implements Serializable { // 總記錄數 private long totalRecord; //總頁數 private int pageCount; //當前頁碼 private int pageNo; //當前頁的記錄數量 private int pageSize; public PageResultBean(PageInfo<T> pageInfo) { super.setData((T) pageInfo.getList()); this.setPageNo(pageInfo.getPageNum()) .setPageSize(pageInfo.getPageSize()) .setPageCount(pageInfo.getPages()) .setTotalRecord(pageInfo.getTotal()); } public PageResultBean setTotalRecord(long totalRecord) { this.totalRecord = totalRecord; return this; } public PageResultBean setPageCount(int pageCount) { this.pageCount = pageCount; return this; } public PageResultBean setPageNo(int pageNo) { this.pageNo = pageNo; return this; } public PageResultBean setPageSize(int pageSize) { this.pageSize = pageSize; return this; } @Override public String toString() { return "PageResultBean{" + "totalRecord=" + totalRecord + ", pageCount=" + pageCount + ", pageNo=" + pageNo + ", pageSize=" + pageSize + '}'; } @Override public PageResultBean setMsg(String msg) { super.setMsg(msg); return this; } @Override public PageResultBean setCode(int code) { super.setCode(code); return this; } @Override public PageResultBean setData(T data) { super.setData(data); return this; } }

附上曉風輕所著的ResultBean(略有修改) ResultBean.java

package com.example.beans; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @NoArgsConstructor public class ResultBean<T> implements Serializable { private static final long serialVersionUID = 1L; public static final int NO_LOGIN = -1; public static final int SUCCESS = 1; public static final int FAIL = 0; public static final int NO_PERMISSION = 2; public static final int USERNAME_EXIST = -909; private String msg = "success"; public static final String TOURIST = "遊客"; private int code = SUCCESS; private T data; public ResultBean(T data) { super(); this.data = data; } public ResultBean(Throwable e) { super(); this.msg = e.toString(); this.code = FAIL; } public ResultBean setMsg(String msg) { this.msg = msg; return this; } public ResultBean setCode(int code) { this.code = code; return this; } public ResultBean setData(T data) { this.data = data; return this; } }

上述兩個Bean,基本所有的介面返回都可以使用,介面返回的統一化,也使得控制層的程式碼更加簡潔

核心:介面返回bean的統一使AOP可以很好的管理,寫好切入點,對於後續需要做的日誌管理,以及方法執行時間,和全域性異常處理,不能再好了

下面看下剛剛的控制層所修改後的效果

@GetMapping("query") public PageResultBean<List<Area>> areaList(@RequestParam(name = "pagenum",required = false,defaultValue = "1") Integer pageNum, @RequestParam(name = "pagesize",required = false,defaultValue = "10") Integer pageSize){ return new PageResultBean<List<Area>>(new PageInfo(areaService.selectAreaAll(pageNum,pageSize))); }

還可以優化的就是兩個引數的接受,以及後續可能會有的引數查詢,可以使用PageResultBean和需要查詢引數的實體類接收

下面啟動DemoApplication

訪問:http://localhost:8080/area/query?pagenum=1&pagesize=10

返回的JSON資料,包括了總頁數,總條數,當前頁數,每頁條數等,表資料在data裡,非常的實用

Spring全家桶系列--SpringBoot漸入佳境

下面是data裡的表資料

Spring全家桶系列--SpringBoot漸入佳境

這裡的顯示JSON外掛為:

https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh

谷歌瀏覽器裡的,推薦使用。程式碼的github地址:

https://github.com/cuifuan/springboot-demo