我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么利用泛型封装通用的service层

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么利用泛型封装通用的service层

这篇“怎么利用泛型封装通用的service层”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么利用泛型封装通用的service层”文章吧。

身为一名开发人员,大家都知道,我们经常会在项目中大量的编写许多重复的代码,比如说

public Entity find(String id);

像这种代码,简单,但是写多了,可能也会容易出错,那么我们能不能直接编写一套完整的,通用的方法呢,这样既不用重复编写,还不用出错,说道通用的方法,泛型是个不错的选择.

基础架构:spring-boot+spring mvc+spring jpa.

jpa是个好东西,个人感觉它最大的好处是不需要自己手动建表.还能在修改了表字段以后,自动给你添加上上去,它不像mybatis,业务改了之后,还需要调整sql语句,

好了,废话不多说,上代码:

一、首先建立一个实体类WebVisitRecordEntity

继承BaseEntity.BaseEntity在项目里面,是所有实体类的最顶层.里面是封装了一些通用的属性.

BaseEntity

package cn.yxw.function; import cn.yxw.function.Enum.status.StatusEnum; import javax.persistence.Column;import javax.persistence.Id;import javax.persistence.MappedSuperclass;import java.io.Serializable;import java.util.Date; @MappedSuperclasspublic abstract class BaseEntity implements Serializable{         @Id    @Column(length = 32 )    private String id;         private Date createTime;         @Column(length = 32 )    private String createUser;         private Date updateTime;         @Column(length = 32 )    private String updateUser;         @Column(length = 8 )    private String delStatus = StatusEnum.FALSE.getStatus();         @Column(length = 8 )    private String enAbleStatus = StatusEnum.TRUE.getStatus();     public String getId() {        return id;    }     public void setId(String id) {        this.id = id;    }     public Date getCreateTime() {        return createTime;    }     public void setCreateTime(Date createTime) {        this.createTime = createTime;    }     public String getCreateUser() {        return createUser;    }     public void setCreateUser(String createUser) {        this.createUser = createUser;    }     public Date getUpdateTime() {        return updateTime;    }     public void setUpdateTime(Date updateTime) {        this.updateTime = updateTime;    }     public String getUpdateUser() {        return updateUser;    }     public void setUpdateUser(String updateUser) {        this.updateUser = updateUser;    }     public String getDelStatus() {        return delStatus;    }     public void setDelStatus(String delStatus) {        this.delStatus = delStatus;    }     public String getEnAbleStatus() {        return enAbleStatus;    }     public void setEnAbleStatus(String enAbleStatus) {        this.enAbleStatus = enAbleStatus;    }}

WebVisitRecordEntity

package cn.yxw.function.domain.plugins; import cn.yxw.function.BaseEntity; import javax.persistence.Entity;import javax.persistence.Inheritance;import javax.persistence.InheritanceType;import javax.persistence.Table; @Entity()@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)@Table(name = "web_visit_Record")public class WebVisitRecordEntity extends BaseEntity {     private static final long serialVersionUID = 341666498307329777L;        private int count = 0;     public int getCount() {        return count;    }     public void setCount(int count) {        this.count = count;    }}

二、有了实体类之后

首先建立一个顶层的api接口。所有通用的api方法,可以放在这里(ResultBean是一个封装了一个结果的数据类,里面包含了定义执行是否成功,执行返回的数据,执行错误提示的消息)

package cn.yxw.function; import cn.yxw.function.result.ResultBean;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable; public interface BaseApi<T extends BaseEntity> {         T get(String id);         T find(String id);         ResultBean<T> delete(String id);     ResultBean<T> delete(T entity);         ResultBean<T> create(T entity);         ResultBean<T> update(T entity);         Page<T> page(Pageable pageable);         boolean exists(String id); }

三、实现BaseApi

既然是要定义通用的api,那么不仅仅只是一套接口,我们需要在定义一个可以实现BaseApi的BaseServiceImpl,之后的所有实现类,都可以继承这个BaseServiceImpl.java的泛型,给了我们的项目很好的扩展性,而顶层BaseEntity也给了我很好的实现方案,将BaseEntity作为泛型的入口

基本时限BaseApi

package cn.yxw.function.service.impl.domain.userCenter; import cn.yxw.function.BaseApi;import cn.yxw.function.BaseEntity;import cn.yxw.function.result.ResultBean;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;  public class BaseServiceImpl<T extends BaseEntity> implements BaseApi<T> {      @Override    public T get(String id) {        return null;    }     @Override    public T find(String id) {        return null;    }     @Override    public ResultBean<T> delete(String id) {        return null;    }     @Override    public ResultBean<T> delete(T entity) {        return null;    }     @Override    public ResultBean<T> create(T entity) {        return null;    }     @Override    public ResultBean<T> update(T entity) {        return null;    }     @Override    public Page<T> page(Pageable pageable) {        return null;    }     @Override    public boolean exists(String id) {        return false;    }}

使用jpa作为BaseServiceImpl的属性.

package cn.yxw.function.service.impl.domain.userCenter; import cn.yxw.function.BaseApi;import cn.yxw.function.BaseEntity;import cn.yxw.function.Enum.code.ServiceCodeEnum;import cn.yxw.function.result.ResultBean;import cn.yxw.function.util.ObjectUtil;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.jpa.repository.JpaRepository; public class BaseServiceImpl<T extends BaseEntity> implements BaseApi<T> {     @Autowired    private JpaRepository<T, String> baseRepository;      @Override    public T get(String id) {        T entity =  this.baseRepository.getOne(id);        return entity;    }     @Override    public T find(String id) {        return this.baseRepository.findById(id).get();    }     @Override    public ResultBean<T> delete(String id) {        this.baseRepository.deleteById(id);        return ResultBean.success("");    }     @Override    public ResultBean<T> delete(T entity) {        this.baseRepository.delete(entity);        return ResultBean.success(entity);    }     @Override    public ResultBean<T> create(T entity) {        if(ObjectUtil.isNull(entity)){            return ResultBean.failfure("数据为空,无法创建!");        }        if(this.exists(entity.getId())){            return ResultBean.failfure("实体id相同,无法重复创建!");        }        entity = this.baseRepository.saveAndFlush(entity);        if(ObjectUtil.isNull(entity)){            return ResultBean.failfure(ServiceCodeEnum.CORE_SYSTEM_FAILURE);        }        return ResultBean.success(entity);    }     @Override    public ResultBean<T> update(T entity) {        if(ObjectUtil.isNull(entity)){            return ResultBean.failfure("数据为空,无法创建!");        }        if(!this.exists(entity.getId())){            return ResultBean.failfure("数据库不存在该数据,无法执行更新");        }        entity = this.baseRepository.saveAndFlush(entity);        if(ObjectUtil.isNull(entity)){            return ResultBean.failfure(ServiceCodeEnum.CORE_SYSTEM_FAILURE);        }        return ResultBean.success(entity);    }     @Override    public Page<T> page(Pageable pageable) {        return null;    }     @Override    public boolean exists(String id) {        return this.baseRepository.existsById(id);    }}

四、定义类自己的api

继承BaseApi,定义实现类,继承BaseServiceImpl.并实现自己的api

package cn.yxw.function.domain.userCenter; import cn.yxw.function.BaseApi;import cn.yxw.function.domain.plugins.WebVisitRecordEntity; public interface WebVisitRecordApi extends BaseApi<WebVisitRecordEntity> {}
package cn.yxw.function.service.impl.domain.userCenter; import cn.yxw.function.domain.plugins.WebVisitRecordEntity;import cn.yxw.function.domain.userCenter.WebVisitRecordApi;import org.springframework.stereotype.Service; @Servicepublic class WebVisitRecordServiceImpl extends BaseServiceImpl<WebVisitRecordEntity> implements WebVisitRecordApi {   }

五、测试

到这里,代码已经结束. 测试一下,构建下controller层. 并进行测试

package cn.yxw.function.controller.System.admin; import cn.yxw.function.controller.BaseController;import cn.yxw.function.domain.plugins.WebVisitRecordEntity;import cn.yxw.function.result.ResultBean;import cn.yxw.function.service.impl.domain.userCenter.WebVisitRecordServiceImpl;import cn.yxw.function.util.ObjectUtil;import com.alibaba.druid.util.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; import java.util.Date;import java.util.Map; @RestController()@RequestMapping(value = "web/record")public class WebVisitRecordsController extends BaseController {     @Autowired    private WebVisitRecordServiceImpl webVisitRecordService;      @GetMapping(value = "/get")    public Map get(String id){        if(StringUtils.isEmpty(id)){            return this.errorWithMsg("参数不得为空");        }        WebVisitRecordEntity entity = this.webVisitRecordService.find(id);        return this.result(entity,"");    }     @PostMapping(value = "/create")    public Map create(int num){        WebVisitRecordEntity entity = new WebVisitRecordEntity();        entity.setId(System.currentTimeMillis()+"");        entity.setCreateTime(new Date());        entity.setCount(num);        ResultBean<WebVisitRecordEntity> result = this.webVisitRecordService.create(entity);        return this.result(result.getDate(),result.getMsg());    }      @PostMapping(value = "/update")    public Map update(String id, int num){        if(StringUtils.isEmpty(id)){            return this.errorWithMsg("参数不得为空");        }        WebVisitRecordEntity entity = this.webVisitRecordService.find(id);        if(ObjectUtil.isNull(entity)){            return this.errorWithMsg("不存在该数据");        }        entity.setUpdateTime(new Date());        entity.setCount(entity.getCount()+num);        ResultBean<WebVisitRecordEntity> result = this.webVisitRecordService.update(entity);        return this.result(result.getDate(),result.getMsg());    } }

怎么利用泛型封装通用的service层

三次测试都已经成功,但是我们真实的项目不可能这么简单.所以我们再次测试下扩展性

等等,不知道你们发现没有,上面的代码有一段是错误的.

我在controller层的属性不是api,而是实现类.......

虽然不影响,但是就无法扩展了...此处做修正

怎么利用泛型封装通用的service层

六、扩展性

WebVisitRecordApi

package cn.yxw.function.domain.userCenter; import cn.yxw.function.BaseApi;import cn.yxw.function.domain.plugins.WebVisitRecordEntity; public interface WebVisitRecordApi extends BaseApi<WebVisitRecordEntity> {         int countAll();}

WebVisitRecordServiceImpl

package cn.yxw.function.service.impl.domain.userCenter; import cn.yxw.function.domain.plugins.WebVisitRecordEntity;import cn.yxw.function.domain.userCenter.WebVisitRecordApi;import cn.yxw.function.util.ObjectUtil;import org.springframework.stereotype.Service; import java.util.List; @Servicepublic class WebVisitRecordServiceImpl extends BaseServiceImpl<WebVisitRecordEntity> implements WebVisitRecordApi {      @Override    public int countAll() {        List<WebVisitRecordEntity> list = super.baseRepository.findAll();        int count = 0;        if(ObjectUtil.isNull(list) || list.size() <= 0){            return count;        }        for (WebVisitRecordEntity entity : list){            count += entity.getCount();        }        return count;    }}

WebVisitRecordController

    @GetMapping(value = "count")    public Map count(){        return this.result(this.webVisitRecordService.countAll(),"执行成功");    }

测试

怎么利用泛型封装通用的service层

以上就是关于“怎么利用泛型封装通用的service层”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么利用泛型封装通用的service层

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么利用泛型封装通用的service层

这篇“怎么利用泛型封装通用的service层”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么利用泛型封装通用的servic
2023-07-02

java泛型通配符怎么使用

Java泛型通配符用于表示未知类型。在泛型类、接口和方法中使用通配符可以使其具有更大的灵活性。通配符有三种使用方式:1. 上界通配符(? extends 类型):表示接受类型参数为类型或其子类的对象。```javapublic void p
2023-09-16

Android中怎么利用PagerAdapter封装类

Android中怎么利用PagerAdapter封装类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。ViewPager是android的support库中的一个控件,也是一
2023-05-30

怎么在springBoot中利用service实现层事务控制的操作

怎么在springBoot中利用service实现层事务控制的操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springBoot使用事物比较简单,在Appl
2023-06-06

怎么利用Golang泛型提高编码效率

本文小编为大家详细介绍“怎么利用Golang泛型提高编码效率”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么利用Golang泛型提高编码效率”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。工具函数虽然标准库里面
2023-07-05

C#中的泛型怎么用

这篇文章将为大家详细讲解有关C#中的泛型怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、简介泛型现在在任何一种语言中都被认为是一个高级的强有力的术语。当我在C++中***次接触模板时,我对之有些疑
2023-06-17

怎么利用Typescript封装本地存储

这篇文章给大家分享的是有关怎么利用Typescript封装本地存储的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本地存储使用场景用户登录后token的存储用户信息的存储不同页面之间的通信项目状态管理的持久化,如r
2023-06-22

怎么在java中利用ParameterizedType实现一个泛型

本篇文章给大家分享的是有关怎么在java中利用ParameterizedType实现一个泛型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java有哪些集合类Java中的集合主
2023-06-14

Java中怎么利用泛型实现数组排序

这篇文章将为大家详细讲解有关Java中怎么利用泛型实现数组排序,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 整数数组的顺序收缩public static int seqSearch(i
2023-06-17

Java中的泛型怎么应用

本篇内容介绍了“Java中的泛型怎么应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!泛型概述泛型在java中有很重要的地位,在面向对象编程
2023-06-02

Java泛型的上界和下界通配符怎么使用

今天小编给大家分享一下Java泛型的上界和下界通配符怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。上界泛型的上界指定
2023-07-05

Spring main方法中怎么调用Dao层和Service层的方法

本篇内容介绍了“Spring main方法中怎么调用Dao层和Service层的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Sprin
2023-06-21

详解Python如何利用pymysql封装项目通用的连接和查询

目录前言pymysql 介绍与安装pymysql 的使用封装项目通用的连接和查询结语前言一个项目通常都需要有数据库,而对于python这门语言,除了一些框架自带orm或者扩展的orm(像django自带orm,flask则需要扩展的orm
2022-07-22

怎么利用promise及参数解构封装ajax请求

这篇文章主要介绍怎么利用promise及参数解构封装ajax请求,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.前端代码
2023-06-08

C#高级静态语言效率利器之泛型怎么引用

这篇文章主要介绍“C#高级静态语言效率利器之泛型怎么引用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#高级静态语言效率利器之泛型怎么引用”文章能帮助大家解决问题。引入所谓泛型,就是创建一个函数,
2023-07-05

golang中的泛型是什么及怎么使用

本篇内容介绍了“golang中的泛型是什么及怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是泛型泛型(Generic)是一种编程
2023-07-06

基于Pydantic封装的通用模型在API请求验证中的应用详解

这篇文章主要介绍了基于Pydantic封装的通用模型在API请求验证中的应用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
2023-05-18

怎么在Android中使用OkUSB封装一个串口通信

这篇文章给大家介绍怎么在Android中使用OkUSB封装一个串口通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。OkUSB一个简洁的Android串口通信框架。功能简介支持设置波特率支持设置数据位支持设置停止位支持
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录