JDK1.5出来后,Java开始支持泛型开发,通过将父类声明为泛型,子类继承父类,子类就能拥有父类的方法,而不需要再写代码。泛型开发能使我们的代码开发提供了很大的简便,简化了我们的代码。
在springboot项目中(其他项目也一样),我们经常要用到增删改查接口,从controller/service/dao层,每一层都要写增删改查代码,每一张数据表都要重复一遍增删改查功能。虽然写起来简单,但是作为程序员来讲,写重复性的代码就是在浪费时间,浪费生命。
程序员的主要精力应该放在如何实现业务上面。
下面我们来看下怎样通过泛型开发来封装代码,简化开发。
一、声明泛型父类
泛型父类包括:controller/service/dao三层。

1、声明泛型虚基类AbstractController,定义接口方法:

public abstract class AbstractController<T, K>{/*** 新增* @param t* @return*/public abstract RtnData insert(T t);/*** 修改* @param t* @return*/public abstract RtnData update(T t);/*** 删除* @param* @return*/public abstract RtnData delete(K id);/*** 按主键查询* @param* @return*/public abstract RtnData get(K Id);/*** 分页查询* @return*/public abstract RtnData queryPageList(int pageSize, int pageIndex, Map<String,Object> params);/*** 多条件查询* @return*/public abstract RtnData queryList(Map<String,Object> params);}

2、实现泛型父类BaseController,继承 AbstractController
这里我们定义泛型父类BaseController,继承并实现AbstractController方法,并且在BaseController中定义每个方法的RequestMapping。这样业务类直接继承BaseController就可以使用默认实现好的增删改查接口了。

public class BaseController<T, K> extends AbstractController<T, K> {@Autowiredprivate IService<T, K> service;@PostMapping("/insert")@Overridepublic RtnData insert(@RequestBody T t) {return RtnData.ok(service.insert(t));}@PostMapping("/update")@Overridepublic RtnData update(@RequestBody T t) {return RtnData.ok(service.update(t));}@GetMapping("/delete")@Overridepublic RtnData delete(K id) {return RtnData.ok(service.delete(id));}@GetMapping("/get")@Overridepublic RtnData get(K id) {return RtnData.ok(service.get(id));}@GetMapping("/page-list")@Overridepublic RtnData queryPageList(@RequestParam(required = false, defaultValue = "20") int pageSize,@RequestParam(required = false, defaultValue = "1") int pageIndex,@RequestParam Map<String,Object> params) {return RtnData.ok(service.queryPageList(pageSize, pageIndex, params));}@GetMapping("/list")@Overridepublic RtnData queryList(@RequestParam Map<String, Object> params) {return RtnData.ok(service.queryList(params));}
}

BaseController注入了泛型IService,用于实现具体的业务操作

3、声明泛型业务接口类IService

public interface IService<T,K>{/*** 新增* @param t* @return*/public Object insert(T t);/*** 修改* @param t* @return*/public Object update(T t);/*** 删除* @param* @return*/public Object delete(K id);/*** 按主键查询* @param* @return*/public T get(K id);/*** 分页查询* @param pageSize* @param pageIndex* @param params* @return*/Object queryPageList(int pageSize, int pageIndex, Map<String, Object> params);/*** 条件查询* @param params* @return*/Object queryList(Map<String, Object> params);
}

4、定义泛型业务类BaseService,实现IService类
BaseService实现IService接口中发方法,编写增删改查操作默认业务实现。子类通过继承BaseService就拥有它的方法。

public class BaseService<T,K> implements IService<T,K> {@Autowiredprotected Mapper<T, K> mapper;private Class<T> modelClass;//当前泛型的真实类型Classpublic BaseService() {ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();modelClass = (Class<T>) pt.getActualTypeArguments()[0];}@Overridepublic Object insert(T t) {return mapper.insert(t);}@Overridepublic Object update(T t) {return mapper.updateByPrimaryKey(t);}@Overridepublic Object delete(K id) {return mapper.deleteByPrimaryKey(id);}@Overridepublic T get(K id) {return mapper.selectByPrimaryKey(id);}@Overridepublic Object queryPageList(int pageSize, int pageIndex, Map<String, Object> params) {PageHelper.startPage(pageIndex, pageSize);Page page = mapper.queryPageList(params);//Page本身是一个ArrayList对象,转换为json时不会保留分页信息PageInfo pageInfo = page.toPageInfo();//将page转换成pageInfo会保存分页信息返回return new PageModel(pageInfo);}@Overridepublic Object queryList(Map<String, Object> params) {return mapper.queryList(params);}}

这里最重要的两行代码:
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
modelClass = (Class) pt.getActualTypeArguments()[0];
通过泛型反射,获取子类中实际要操作的对象class,通过class,service就知道要对哪个对象进行增删改查操操作。
另外,我们注入了dao层的泛型Mapper<T, K>,通过Mybatis对数据库进行增删改查操作

5、声明Dao层泛型Mapper

public interface Mapper<T, K> {int deleteByPrimaryKey(K id);int insert(T record);int insertSelective(T record);T selectByPrimaryKey(K id);int updateByPrimaryKeySelective(T record);int updateByPrimaryKey(T record);/*** 分页查询(由子类实现)* @param params* @return*/Page queryPageList(Map<String, Object> params);/*** 多条件查询(由子类实现)* @param params* @return*/List<Map<String,Object>> queryList(Map<String, Object> params);
}

这里我们使用mybatis实现dao层的操作,这里的声明的接口方法名称与mybatis工具生成mapper.xml一致

到这里,我们的泛型父类代码已经全部编写完成。可以将上述代码达成jar包,放入项目里面作为基础包直接引用。
下面我们来说说怎么在项目里面实际使用。

二、项目应用
在项目里面引用,只需在子类代码层中继承上述父类,子类就拥有父类中的功能。

1、子类Controller

@RestController
@RequestMapping("/api/dic")
public class DataDicController extends BaseController<DataDic, Integer> {
}

看到没,里面什么方法也没写,只声明了RequestMapping,另外将泛型用具体对象类型替换。
DataDic是我操作的对象,Integer是DataDic的主键类型。
这个BaseController的新增接口地址是/api/dic/insert,/insert是使用父类的RequestMapping。
另外我也没写Service的注入,因为容器会根据要父类中要注入的泛型Service,直接找到IService对应的泛型实例

2、子类Service

@Service
public class DataDicService extends BaseService<DataDic, Integer> {
}

同样,Service也没有任何代码,也没有注入Mapper,只继承了泛型

3、子类Mapper

@Mapper
public interface DataDicMapper extends com.cc.app.base.dao.Mapper<DataDic, Integer> {
}

Mapper需要继承我们自己定义的泛型Mapper,这样才能被Service找到。
说明:我们通过工具生成的Mapper对象会包含默认的方法,大家不用删除,因为和继承的Mapper方法名一致,就当是覆盖Override

到此,所有工作结束,我们的DataDicController的增删改查接口写好 ,下面我们来测试。

三、接口测试

1、查询接口get

2、插入接口insert

springboot泛型封装开发相关推荐

  1. 第13章 Kotlin 集成 SpringBoot 服务端开发(1)

    第13章 Kotlin 集成 SpringBoot 服务端开发 本章介绍Kotlin服务端开发的相关内容.首先,我们简单介绍一下Spring Boot服务端开发框架,快速给出一个 Restful He ...

  2. 3万字《SpringBoot微服务开发——Shiro(安全)》

    SpringBoot微服务开发--Shiro(安全) 文章目录 SpringBoot微服务开发--Shiro(安全) Shiro(安全) 1.Shiro简介 2.Shiro有哪些功能? 3.Shiro ...

  3. SpringBoot+Vue项目实例开发及部署

    目录 一.SpringBoot快速上手 1.SpringBoot介绍 2.SpringBoot特点 3.快速创建SpringBoot应用 4.SpringBoot开发热部署 二.Web开发基础 1.W ...

  4. 基于Springboot+VUE框架开发的企业微信SCRM系统

    应用介绍 基于Springboot+ vue框架开发的企业微信SCRM 系统是一款基于人工智能的企业微信SCRM系统,企业微信SCRM系统基于企业微信开放能力,不仅集成了企微基础的客户管理和后台管理功 ...

  5. IDEA中进行SpringBoot整合spring-ws开发webservice接口后期要修改xsd文件流程

    场景 SpringBoot整合spring-ws开发webservice接口(全流程详细教程) 参照: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/articl ...

  6. springboot+openFeign+nacos开发实战

    前面说了dubbo+nocas开发实战,现在来说下springboot+openFeign+nacos开发实战. 文章目录 什么是Feign Nacos环境准备 Nacos与openFegin整合 项 ...

  7. SpringBoot模拟数据库开发

    Spring boot模拟数据库开发 准备工作 把准备的后台模板准备好,地址: 链接:https://pan.baidu.com/s/13mNCQ18_nl6DHpxfKl4ZFw 提取码:love ...

  8. 基于 SpringBoot + Vue 框架开发的网页版聊天室项目

    ‍ ‍简介 微言聊天室是基于前后端分离,采用SpringBoot+Vue框架开发的网页版聊天室.使用了Spring Security安全框架进行密码的加密存储和登录登出等逻辑的处理,以WebSocke ...

  9. springboot+cxf框架开发SOAP接口

    什么是SOAP SOAP是 simple object access protocol(简单对象访问协议)的缩写.这个协议是用http的post请求实现的,跟一般的post请求不同的是,在请求的hea ...

最新文章

  1. 今年我读了四个开源项目的源码,来分享下心得
  2. Python使用matplotlib可视化绘制并通过Tkinter生成按钮将可视化结果导出为pdf文件
  3. django(未解决的问题)
  4. 将继续深入学习网络编程
  5. 【渝粤题库】广东开放大学 互联网营销 形成性考核
  6. 如何在Hyper-V上安装Centos7
  7. Bootstrap输入框组中可以使用的元素
  8. 孩子教育经验,自己整理,不看后悔一辈子
  9. Python+sklearn使用逻辑回归算法预测期末考试能否及格
  10. 火山安卓简单分组列表框
  11. js获取chrome浏览器版本信息
  12. MySQL环境变量的配置(详细教程)
  13. html table冻结首行,Html Table的首行和首列冻结效果
  14. 用Python 统计、分析2020年江苏省事业单位招聘岗位 Excel 表格信息
  15. Excel工作表保护忘记密码解决方法(.xls和.xlsx)
  16. SMTP 550错误
  17. 微分方程_偏微分方程
  18. 挖掘企业数据矿产,袋鼠云数栈(DTinsight)助力企业搭建数据中台
  19. 魅族m15简单开启Usb调试模式的步骤
  20. 使用浏览器打开exe文件

热门文章

  1. windows系统热键占用工具、强制卸载工具
  2. 推荐一个好用的GPU租用平台
  3. 《爱的艺术》读书笔记作文3800字
  4. 中关村软件园机房的服务方案
  5. PHP学习笔记(五)数组
  6. 带音乐的计算机拿来当玩具,5款音乐玩具对决,带给孩子不一样的音乐世界
  7. Vue使用视频作为背景
  8. C语言系列——第三节-函数
  9. 商家笑了 设计师哭了,京东+英特尔的AI这招太绝了
  10. python for语句 else_python for和else语句趣谈