简单描述:因为前后端分离,开发完模块之后,接到team leader的指令,我这个渣渣javaer需要给前端人员返回一个接口,具体内容是课程列表json和分类列表json。emmmm,第一次写接口,心理是有点啪啪啪的,手误,怕怕的,完全不知道应该怎么写。不过,程序员从来都不会说做不到,能做到的是想方设法的去搞定他。最终,还是把它搞出来了,哈哈哈哈,experience有增长了一点点。

过程:

创建实体类,并且使用@Table和数据库表相对应,@Getter@Setter都是lombok包下的 @Id@Table@Column是javax.persistence包下的

//实体类Course @Column中的是表字段 要注意的是必须和表完全对应,表里有多少字段,类就有多少属性 
@Getter
@Setter
@Table(name = "table_course")
public class Course {
@Id
@Column(name = "course_id")
private String courseId;
@Column(name = "course_name")
private String courseName;
@Column(name = "course_code")
private String courseCode;
@Column(name = "course_type")
private String courseType;
@Column(name = "is_del")
private String isDel;//未删除 1 已删除 0
}  //实体类Dictionary
import lombok.Getter;
import lombok.Setter; import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table; @Getter
@Setter
@Table(name = "table_dict")
public class Dictionary {
@Id
@Column(name = "dict_id")
private String dictId;
@Column(name = "dict_name")
private String dictName;
@Column(name = "dict_code")
private String dictCode;
@Column(name = "sort_no")
private String sortNo;
@Column(name = "parent_id")
private String parentId;
@Column(name = "description")
private String description;

Controller层

//controller层 
import xxx.xx.xxxxx.xxxx.xxxxx.ResultDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import java.util.List;
import java.util.Map;
@Api(value = "CourseController",tags = "课程相关查询")
@RestController
@RequestMapping("/course")
public class CourseController extends BaseController {
@Autowired
private CourseService courseService; @ApiOperation(value = "获取课程列表" notes= "获取课程列表")
@RequestMapping(value = "/queryList", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
public ResultDto queryList(){
List<CourseVo> list = null;
try {
list = courseService.queryList();
if(list != null){
if(list.size()<1){
return ResultDto.success("返回结果无内容");
}
}
} catch (Exception e) {
e.printStackTrace();
return ResultDto.error();
}
return ResultDto.success(list);
} @ApiOperation(value = "获取课程分类列表",notes = "根据课程编码查询")
@RequestMapping(value = "/getCourseType",method = RequestMethod.GET, produces = "application/json;charset=utf-8")
public ResultDto getCourseType(String code){
List<Map<String,String>> list = null;
try {
if (!"".equals(code) && code != null) {
list = courseService.getCourseType(code);
if(list != null){
if(list.size()<1){
return ResultDto.success("返回结果无内容");
}
}
}else{
return ResultDto.error("参数错误");
}
} catch (Exception e) {
e.printStackTrace();
return ResultDto.error();
}
return ResultDto.success(list);
}

Service层

//service层
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; @Service
public class CourseService {
@Resource
private CourseMapper courseMapper;
@Resource
private DictionaryMapper dictionaryMapper; public List<CourseVo> queryList()throws Exception{
Example example = new Example(Course.class);
example.createCriteria().andEqualTo("isDel",1);
List<Course> list = courseMapper.selectByExample(example);
List<CourseVo> reList = new ArrayList<>();
if (list !=null){
for(Course obj:list){
CourseVo course = new CourseVo();
BeanUtils.copyProperties(obj,course);
reList.add(course);
}
}
return reList;
} public List<Map<String,String>> getCourseType(String code) throws Exception{
Dictionary obj = new Dictionary();
obj.setDictCode(code);
Dictionary dict = dictionaryMapper.selectOne(obj);
Example example = new Example(Dictionary.class);
example.createCriteria().andEqualTo("parentId",dict.getDictId());
List<Dictionary> list = DictionaryMapper.selectByExample(example);
List<Map<String,String>> reList = new ArrayList<>();
if(list != null){
for(Dictionary test:list){
Map<String,String> map = new HashMap<>();
map.put(test.getDictName(),test.getDictCode());
reList.add(map);
}
}
return reList;
}

对应的Mapper接口

//CourseMapper接口
import xxx.xx.xxxxxx.xxxx.util.MyMapper; public interface CourseMapper extends MyMapper<Course> {
}  //DictionaryMapper接口
import xxx.xx.xxxxxx.xxxx.util.MyMapper; public interface DictionaryMapper extends MyMapper<Dictionary>{
}

MyMapper<T>

//MyMapper接口
/*
* The MIT License (MIT)
*
* Copyright (c) 2014-2016 abel533@gmail.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/ package xxx.xx.xxxxxx.xxxxx.util; import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper; /**
* 继承自己的 MyMapper
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
//TODO
//FIXME 特别注意,该接口不能被扫描到,否则会出错

注意:可以使用google浏览器的postman插件  或者 火狐浏览器的RestClient插件来进行接口的测试工作。输入地址的时候要确保和配置文件里的端口号对应。

总结:第一次开发接口,能顺利的搞出来真的是挺开心的,以前的时候就在好奇,经常听接口开发之类的,也会有疑问 如果自己来开发接口的话能不能开发出来。

相关注解详细参考:https://blog.csdn.net/xiaojin21cen/article/details/78654652

浅谈rest風格的接口开发的更多相关文章

  1. 浅谈使用 PHP 进行手机 APP 开发(API 接口开发)

    做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨 ...

  2. 以用户注册功能模块为例浅谈MVC架构下的JavaWeb开发流程

    JavaWeb应用开发,撇开分布式不谈,只讨论一个功能服务应用的开发,无论是使用原生的Servlet/JSP方案,还是时下的SSM架构,都有一套经过工程实践考验的最佳实践,这综合考虑了团队协作.项目管 ...

  3. 浅谈Bootstrap自适应功能在Web开发中的应用

    随着移动端市场的强势崛起,web的开发也变得愈发复杂,对于个体开发者来说,自己开发的网站,在电脑.手机.Pad等上面都要有正常的显示以及良好的用户体验.如果每次都要自己去调整网页去匹配各个不同的客户端 ...

  4. 浅谈C#抽象类和C#接口

    原文地址:http://www.cnblogs.com/zhxhdean/archive/2011/04/21/2023353.html 一.C#抽象类: C#抽象类是特殊的类,只是不能被实例化:除此 ...

  5. 浅谈Nutch插件机制(含开发实例)

    plugin(插件)为nutch提供了一些功能强大的部件,举个例子,HtmlParser就是使用比较普遍的用来分析nutch抓取的html文件的插件. 为什么nutch要使用这样的plugin系统? ...

  6. Android安全开发之启动私有组件漏洞浅谈

    0x00 私有组件浅谈 android应用中,如果某个组件对外导出,那么这个组件就是一个攻击面.很有可能就存在很多问题,因为攻击者可以以各种方式对该组件进行测试攻击.但是开发者不一定所有的安全问题都能 ...

  7. Salesforce 生命周期管理(一)应用生命周期浅谈

    本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/determine-which-application-lifecycle ...

  8. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

  9. 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载

    转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...

随机推荐

  1. WIKI 部署后记录

    使用说明 环境 MYSQL 安装方式: YUM 版本:5.7 账号: root / 123456 主机白名单: localhost 账号:admin / 123456 主机白名单: % 账号:conf ...

  2. 关于 redis 的 数据类型 和 内存模型

    该文章 是在读了 公众号 : java 后端技术 之后 做的一个小记录 原文网址  : https://mp.weixin.qq.com/s/mI3nDtQdlVlLv2uUTxJegA 作者文章写的 ...

  3. 第六周java学习总结

    学号 20175206 <Java程序设计>第六周学习总结 教材学习内容总结 第七章: 主要内容 内部类 匿名类 异常类 断言 重点和难点 重点:内部类和异常类的理解 难点:异常类的使用 ...

  4. 【JS】JavaScript 指定日期增加天数

    指定某个日期(字符串),增加n天后,输出日期字符串,格式:年-月-日: /** * [dateAddDays 从某个日期增加n天后的日期] * @param {[string]} dateStr [日 ...

  5. springboot集成freemarker静态资源无法访问

    如题配置文件加上 #设定静态文件路径,js,css等.static为你放置静态资源的文件夹名称,也可以叫别的名字.properties加上 spring.mvc.static-path-pattern ...

  6. 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作

    页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...

  7. c语言变量及输入输出

    scanf: 格式字符串的一般形式:%[*][输入数据宽度][长度] 类型  (其中有方括号[] 的项为任选项.) 各项意义: 1) 类型:表示输入数据的类型,其格式符和意义如下表所示.        ...

  8. 开放源代码的设计层面框架Spring——day02

    spring第二天     一.基于注解的IOC配置         1.1写在最前             学习基于注解的IOC配置,大家脑海里首先得有一个认知,即注解配置和xml配置要实现的功能是 ...

  9. 2019第十二届全国大学生信息安全实践创新赛线上赛Writeup

    本文章来自https://www.cnblogs.com/iAmSoScArEd/p/10780242.html  未经允许不得转载! 1.MISC-签到 下载附件后,看到readme.txt打开后提 ...

  10. 【译】使用 Flutter 实现跨平台移动端开发

    作者: Mike Bluestein   | 原文地址:[https://www.smashingmagazine.com/2018/06/google-flutter-mobile-developm ...