简单描述:因为前后端分离,开发完模块之后,接到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. sql stuff函数的语法和作用

    sql stuff函数用于删除指定长度的字符,并可以在制定的起点处插入另一组字符.sql stuff函数中如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串.如果要删除 ...

  2. springdata 一对多 级联操作 在注解里面开启级联操作@OneToMany(mappedBy = "customer",cascade = CascadeType.ALL)

  3. mpvue——Error: Cannot find module 'escape-string-regexp'

    报错 $ cnpm run build > mpvue-qq@1.0.0 build D:\wamp\www\wxsmallsoft\mini-0212\mpvueQQ > node bu ...

  4. python高级编程和算法

    import copy #a = ("a","b","c") #a = ["a","b"," ...

  5. x86汇编语言实践(3)

    0 写在前面 为了更深入的了解程序的实现原理,近期我学习了IBM-PC相关原理,并手工编写了一些x86汇编程序. 在2017年的计算机组成原理中,曾对MIPS体系结构及其汇编语言有过一定的了解,考虑到 ...

  6. MVN TEST指定运行脚本

    clean:表示将你上一次编译生成的一些文件删除 test:表示只执行测试代码 >mvn clean test -Dtest=[ClassName] 运行测试类中指定的方法:这个需要maven- ...

  7. 对称加密之AES加密详解

    最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...

  8. laravel windows安装

    第一步安装composer 下载地址:https://getcomposer.org/ 第二步:更改laravel下载地址 选项一.全局配置(推荐) $ composer config -g repo ...

  9. B树和B+树的插入、删除图文详解(good)

    B树和B+树的插入.删除图文详解 1. B树 1. B树的定义 B树也称B-树,它是一颗多路平衡查找树.我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数 ...

  10. 【转】BTree,B-Tree,B+Tree,B*Tree

    B树: 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...