您的位置:首页 > 编程语言 > Java开发

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

2018-11-19 14:58 260 查看

1.Lombok插件

对于开发人员来说,我要解释这个什么意思,你肯定也是一知半解,直接来代码解释吧

欢迎工作一到八年的Java工程师朋友们加入Java高级交流群:854630135

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢

哦对了,喜欢就别忘了关注一下哦~

 

1.1 代码演示

[code]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之后

[code]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插件

安装完重启IDEA

打开设置找到上述并勾选,然后在build.gradle文件中增加

//让gradle具有内置的compileOnly范围,可用于告诉gradle仅在编译期间添加lombok compileOnly 'org.projectlombok:lombok:1.18.4'

刷新Gradle之后就可以了

然后随意找个测试类,例如如下

[code]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中引入依赖

[code]/** 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文件中无查询全部的方法,这里补上一下

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

然后在dao借口插入方法接口 AreaMapper.java

[code]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

[code]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

[code]/** * 分页核心代码 * @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

[code]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进行测试

 

 

到这里已经可以了

如果你的有问题,在我github有代码,或者百度下错误,因为每个人电脑的java版本不同,环境不同

3.API接口返回统一化

现在的很多项目都是前后端分离的项目,所以后台人员返回的参数参差不齐,每次对接都需要去交流一下,造成开发效率很低。

例如,一个操作更新成功,后台甲可能就返回给前台一个1,而乙返回一个Map格式,假如批量更新呢,返回的有时候不止是1了,所以接口返回统一化很重要。

萌新:那小哥,我又不是负责人,怎么统一呢

小哥:最少你自己用了之后返回的API的格式是固定的,前台很好拿数据

萌新:好的,好的开发规范,人人有责

PageResultBean.java

[code]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

[code]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可以很好的管理,写好切入点,对于后续需要做的日志管理,以及方法运行时间,和全局异常处理,不能再好了

下面看下刚刚的控制层所修改后的效果

[code]@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插件为:

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

谷歌浏览器里的,推荐使用。代码的github地址:

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

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: