萌新:小哥,我在实体类写了那么多get/set方法,看着很迷茫
小哥:那不是能够自动生成吗?
萌新:虽然能够自动生成,可是若是我要修改某个变量的数据类型,我岂不是还要去修改get/set方法?
小哥:哈哈,那我今天给你说一个插件,lombok能够解决你的问题html
对于开发人员来讲,我要解释这个什么意思,你确定也是只知其一;不知其二,直接来代码解释吧java
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以后mysql
package com.example.entity;
import lombok.Data;
@Data
public class Area {
private Integer id;
private Integer postalcode;
private String address;
private Integer type;
}
复制代码
以上二者的效果是相同的,如今咱们知道它是干吗的了,下面开始使用吧git
在Intellij IDEA中安装lombok插件github
安装完重启IDEAweb
打开设置找到上述并勾选,而后在build.gradle文件中增长spring
//让gradle具备内置的compileOnly范围,可用于告诉gradle仅在编译期间添加lombok
compileOnly 'org.projectlombok:lombok:1.18.4'
复制代码
刷新Gradle以后就能够了sql
而后随意找个测试类,例如以下chrome
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();
}
}
复制代码
萌新:小哥,我很苦恼分页这个功能怎么办?
小哥:那不是能够写好一个逻辑直接复制吗?
萌新:那也须要不少行代码,致使了须要在mapper以及业务层作不少无用功
小哥:哈哈,那我来告诉你一款分页插件,解决你的困扰json
首先,在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.java** 用postman进行测试
postman下载地址:www.cnblogs.com/wangfeng520…
postman是一款能够用测试你接口的软件,推荐花个半个小时来熟悉下
如今的不少项目都是先后端分离的项目,因此后台人员返回的参数良莠不齐,每次对接都须要去交流一下,形成开发效率很低,例如,一个操做更新成功,后台甲可能就返回给前台一个1,而乙返回一个Map格式,假如批量更新呢,返回的有时候不止是1了,因此接口返回统一化很重要。
萌新:那小哥,我又不是负责人,怎么统一呢
小哥:最少你本身用了以后返回的API的格式是固定的,前台很好拿数据
萌新:好的,好的开发规范,人人有责
小哥:和你说下阿里Java开发规范文档能够看下,文档地址:files.cnblogs.com/files/han-1…
萌新:收到!
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里,很是的实用
下面是data里的表数据
这里的显示JSON插件为:chrome.google.com/webstore/de… 谷歌浏览器里的,推荐使用,这里或许须要经过GFW,不过谷歌插件里好像有个谷歌访问助手,自行研究吧,哈哈
获取最新更新地址
juejin.im/post/5d1496…
欢迎关注微信公众号