寻找写代码感觉(七)之封装请求参数和返回参数
2021-10-13 23:43
696 查看
一、目的
封装请求参数的目的,是为了统一和方便。直白点说,如果只查询一个属性,传一个入参,这是没问题的,要是一个对象有100个属性,查询需要多个参数关联,就需要统一方便管理了,简单说传对象就完了,哈哈哈。
二、实际案例
先举个例子,大家一看便知,比如我现在想搞个模糊查询,按照名称查询。
1、接口改造
还是那个查询接口开始改造,示例代码如下:
package com.rongrong.wiki.controller; import com.rongrong.wiki.domain.EBook; import com.rongrong.wiki.resp.CommonResp; import com.rongrong.wiki.service.EBookService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * @author longrong.lang * @version 1.0 * @description */ @RestController @RequestMapping("/ebook") public class EBookController { @Resource private EBookService eBookService; @GetMapping("/list") public CommonResp list(String name) { CommonResp<List<EBook>> resp = new CommonResp<>(); List<EBook> list = eBookService.list(name); resp.setMessage("执行查询成功!"); resp.setContent(list); return resp; } }
2、从Service层改造
那么我先从
Service加个入参,比如
Name,这就是我们常说的按照关键字查询,
Sql来看的话就是
like一下,这块我就不废话了,有点墨迹了,示例代码如下:
package com.rongrong.wiki.service; import com.rongrong.wiki.domain.EBook; import com.rongrong.wiki.domain.EBookExample; import com.rongrong.wiki.mapper.EBookMapper; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** * @author rongrong * @version 1.0 * @description * @date 2021/10/13 10:09 */ @Service public class EBookService { @Resource private EBookMapper eBookMapper; public List<EBook> list(String name) { EBookExample eBookExample = new EBookExample(); //此处代码的意思相当于,搞了一个Sql的where条件 EBookExample.Criteria criteria = eBookExample.createCriteria(); criteria.andNameLike("%"+name+"%"); return eBookMapper.selectByExample(eBookExample); } }
3、接口改造测试
查询结果:
三、需求变更
现在我想通过
ID和
Name来查询,或者多个参数来查询,该怎么办?
1、构造统一入参
很简单,直接传个类(对象即可),那么我们先来个统一的入参构造吧,先以两个参数作为入参为例,示例代码如下:
package com.rongrong.wiki.req; public class EBookReq { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { 56c this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getClass().getSimpleName()); sb.append(" ["); sb.append("Hash = ").append(hashCode()); sb.append(", id=").append(id); sb.append(", name=").append(name); sb.append("]"); return sb.toString(); } }
2、构造统一返回
为什么构造统一返回信息?
比如我们登录成功,不能把密码字段,也返回给用户吧,感觉好不专业是不是,正常只返回几个字段即可,所以才有了统一返回信息一说。
示例代码如下:
package com.rongrong.wiki.resp; public class EBookResp { private Long id; private String name; private Long category1Id; private Long category2Id; private String description; private String cover; private Integer docCount; private Integer viewCount; private Integer voteCount; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } publ 56c ic void setName(String name) { this.name = name; } public Long getCategory1Id() { return category1Id; } public void setCategory1Id(Long category1Id) { this.category1Id = category1Id; } public Long getCategory2Id() { return category2Id; } public void setCategory2Id(Long category2Id) { this.category2Id = category2Id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getCover() { return cover; } public void setCover(String cover) { this.cover = cover; } public Integer getDocCount() { return docCount; } public void setDocCount(Integer docCount) { this.docCount = docCount; } public Integer getViewCount() { return viewCount; } public void setViewCount(Integer viewCount) { this.viewCount = viewCount; } public Integer getVoteCount() { return voteCount; } public void setVoteCount(Integer voteCount) { this.voteCount = voteCount; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getClass().getSimpleName()); sb.append(" ["); sb.append("Hash = ").append 3448 (hashCode()); sb.append(", id=").append(id); sb.append(", name=").append(name); sb.append(", category1Id=").append(category1Id); sb.append(", category2Id=").append(category2Id); sb.append(", description=").append(description); sb.append(", cover=").append(cover); sb.append(", docCount=").append(docCount); sb.append(", viewCount=").append(viewCount); sb.append(", voteCount=").append(voteCount); sb.append("]"); return sb.toString(); } }
3、接口改造
示例代码如下:
package com.rongrong.wiki.controller; import com.rongrong.wiki.req.EBookReq; import com.rongrong.wiki.resp.CommonResp; import com.rongrong.wiki.resp.EBookResp; import com.rongrong.wiki.service.EBookService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * @author longrong.lang * @version 1.0 * @description */ @RestController @RequestMapping("/ebook") public class EBookController { @Resource private EBookService eBookService; @GetMapping("/list") public CommonResp list(EBookReq eBookReq) { CommonResp<List<EBookResp>> resp = new CommonResp<>(); List<EBookResp> list = eBookService.list(eBookReq); resp.setMessage("执行查询成功!"); resp.setContent(list); return resp; } }
4、Service层改造
示例代码如下:
package com.rongrong.wiki.service; import com.rongrong.wiki.domain.EBook; import com.rongrong.wiki.domain.EBookExample; import com.rongrong.wiki.mapper.EBookMapper; import com.rongrong.wiki.req.EBookReq; import com.rongrong.wiki.resp.EBookResp; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; /** * @author rongrong * @version 1.0 * @description * @date 2021/10/13 10:09 */ @Service public class EBookService { @Resource private EBookMapper eBookMapper; public List<EBookResp> list(EBookReq eBookReq) { EBookExample eBookExample = new EBookExample(); //此处代码的意思相当于,搞了一个Sql的where条件 EBookExample.Criteria criteria = eBookExample.createCriteria(); criteria.andNameLike("%"+eBookReq.getName()+"%"); List<EBook> eBookList = eBookMapper.selectByExample(eBookExample); List<EBookResp> eBookRespList = new ArrayList<>(); for (EBook eBook: eBookList) { EBookResp eBookResp = new EBookResp(); //spring boot 自带的BeanUtils完成对象的拷贝 BeanUtils.copyProperties(eBook, eBookResp); eBookResp.setId(12345L); eBookRespList.add(eBookResp); } return eBookRespList; } }
5、接口改造后测试
6、Service层再改造
CopyUtil工具类,示例代码如下:
package com.rongrong.wiki.util; import org.springframework.beans.BeanUtils; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; public class CopyUtil { /** * 单体复制 */ public static <T> T copy(Object source, Class<T> clazz) { if (source == null) { return null; } T obj = null; try { obj = clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); return null; } BeanUtils.copyProperties(source, obj); return obj; } /** * 列表复制 */ public static <T> List<T> copyList(List source, Class<T> clazz) { List<T> target = new ArrayList<>(); if (!CollectionUtils.isEmpty(source)){ for (Object c: source) { T obj = copy(c, clazz); target.add(obj); } } return target; } }
对Service层再改造,示例代码如下:
package com.rongrong.wiki.service; import com.rongrong.wiki.domain.EBook; import com.rongrong.wiki.domain.EBookExample; import com.rongrong.wiki.mapper.EBookMapper; import com.rongrong.wiki.req.EBookReq; import com.rongrong.wiki.resp.EBookResp; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; import static com.rongrong.wiki.util.CopyUtil.copyList; /** * @author rongrong * @version 1.0 * @description * @date 2021/10/13 10:09 */ @Service public class EBookService { @Resource private EBookMapper eBookMapper; public List<EBookResp> list(EBookReq eBookReq) { EBookExample eBookExample = new EBookExample(); //此处代码的意思相当于,搞了一个Sql的where条件 EBookExample.Criteria criteria = eBookExample.createCriteria(); criteria.andNameLike("%"+eBookReq.getName()+"%"); List<EBook> eBookList = eBookMapper.selectByExample(eBookExample); //List<EBookResp> eBookRespList = new ArrayList<>(); //for (EBook eBook: eBookList) { // //EBookResp eBookResp = new EBookResp(); // ////spring boot 自带的BeanUtils完成对象的拷贝 // //BeanUtils.copyProperties(eBook, eBookResp); // //eBookResp.setId(12345L); // //单体复制 // EBookResp copy = copy(eBook, EBookResp.class); // eBookRespList.add(copy); //} //列表复制 List<EBookResp> respList = copyList(eBookList, EBookResp.class); return respList; } }
7、接口改造后测试
四、最后
统一是为了更好的管理和维护,写代码确实会让人很兴奋,好在吃了止痛药,要不我这老腰肯定又废了,感谢阅读,觉得好请给我点个推荐,谢谢。
相关文章推荐
- IOS博客项目搭建-20-项目重构-封装请求参数和返回的结果
- 关于向后台请求数据(get请求,无参数传递),返回html代码(实际需要返回的是json数据)的解决方案
- HTTP请求返回代码含义
- Spring MVC如何接收浏览器传递来的请求参数--request--形参--实体类封装(类比Struts2模型驱动)
- ajax 原生代码 已封装get,post,封装 附加 Promise 如何请求数据 详解
- spring mvc自定义过滤器filter实现对请求参数编解码的代码
- Postman 使用前一个请求的返回值做参数
- Jmeter对于请求参数封装及使用
- ajax跨域请求,支持js的ajax跨域请求,只需要设置后台代码的返回头允许跨域
- 解决三星手机post请求时参数包括集合,封装成JSONObject,结果不是数组而是数组的地址问题
- 代码重构-封装参数
- jquery+ajax每秒向后台发送请求数据然后返回页面的代码
- php curl请求信息和返回信息设置代码实例,特别是在请求过程中存在重定向的时候获取请求返回头信息
- RetroFit请求参数和返回格式说明
- java执行存储过程代码 带返回参数
- vue中axios请求的封装实例代码
- JavaScript 带有参数并返回值【每日一段代码54】
- SpringMVC Controller接收前台ajax的GET或POST请求返回各种参数
- 寻找写代码感觉(一)之使用 Spring Boot 快速搭建项目
- java filter打印请求返回参数