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

作者:cuifuan;
來源:Java知音

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


萌新:小哥,我在實體類寫了那麼多get/set方法,看著很迷茫

小哥:那不是可以自動生成嗎?

萌新:雖然可以自動生成,但是如果我要修改某個變量的數據類型,我豈不是還要去修改get/set方法?

小哥:哈哈,那我今天給你說一個插件,lombok可以解決你的問題

1.Lombok插件

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

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文件中無查詢全部的方法,這裡補上一下

 

然後在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 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 selectAreaAll(Integer pageNum,Integer pageSize);
}
上述接口的實現類加上 AreaServiceImpl.java
/**
* 分頁核心代碼
* @param pageNum
* @param pageSize
* @return
*/
@Override
public List selectAreaAll(Integer pageNum,Integer pageSize) {
//這個要在你的查詢之前加哦
PageHelper.startPage(pageNum,pageSize);
//這裡直接查詢全部就行了,分頁插件會替你做分頁,也無需擔心性能問題,會自動補上limit的
List 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 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進行測試

postman下載地址:

https://www.cnblogs.com/wangfeng520/p/5892125.html

postman是一款可以用測試你接口的軟件,推薦花個半個小時來熟悉下


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


到這裡已經可以了

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

3.API接口返回統一化

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

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

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

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

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

小哥:和你說下阿里Java開發規範文檔可以看下。

文檔地址:https://files.cnblogs.com/files/han-1034683568/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%E7%BB%88%E6%9E%81%E7%89%88v1.3.0.pdf

萌新:收到!

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 extends ResultBean implements Serializable {
// 總記錄數
private long totalRecord;
//總頁數

private int pageCount;
//當前頁碼
private int pageNo;
//當前頁的記錄數量
private int pageSize;
public PageResultBean(PageInfo 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 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> areaList(@RequestParam(name = "pagenum",required = false,defaultValue = "1") Integer pageNum,
@RequestParam(name = "pagesize",required = false,defaultValue = "10") Integer pageSize){
return new PageResultBean>(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


分享到:


相關文章: