广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何利用泛型封装通用的service层
  • 410
分享到

如何利用泛型封装通用的service层

2024-04-02 19:04:59 410人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、首先建立一个实体类WEBVisitRecordEntity二、有了实体类之后三、实现Baseapi四、定义类自己的api五、测试六、扩展性七、总结身为一名开发人员,大家都知道

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

public Entity find(String id);

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

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

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

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

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

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

1.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;
 

@MappedSuperclass
public 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;
    }
}

2.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作为泛型的入口

1.基本时限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;
    }
}

2.使用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;
 

@Service
public 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());
    } 
}

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

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

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

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

六、扩展性

1. 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();
}

2. 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;
 

@Service
public 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;
    }
}

3. WebVisitRecordController

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

4.测试

七、总结

emmmm.....其实我上面还有个小错误,就留给你们寻找吧

其实,封装的这个service层,也有很大的局限性,比如说,如果我需要自定义dao层的方法,怎么办?需要执行sql语句怎么办,仔细想想,我们能不能再封装一个BaseRepository呢?然后作为BaseServiceImpl中的属性传入??????

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 如何利用泛型封装通用的service层

本文链接: https://www.lsjlt.com/news/152161.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何利用泛型封装通用的service层
    目录一、首先建立一个实体类WebVisitRecordEntity二、有了实体类之后三、实现BaseApi四、定义类自己的api五、测试六、扩展性七、总结身为一名开发人员,大家都知道...
    99+
    2022-11-13
  • 怎么利用泛型封装通用的service层
    这篇“怎么利用泛型封装通用的service层”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么利用泛型封装通用的servic...
    99+
    2023-07-02
  • 详解Python如何利用pymysql封装项目通用的连接和查询
    目录前言pymysql 介绍与安装pymysql 的使用封装项目通用的连接和查询结语前言 一个项目通常都需要有数据库,而对于python这门语言,除了一些框架自带orm或者扩展的orm(像django自带orm,flas...
    99+
    2022-07-22
    Python pymysql封装连接 Python pymysql封装 查询 Python pymysql
  • 如何利用Typescript封装本地存储
    目录前言本地存储使用场景使用中存在的问题解决方案功能实现加入过期时间加入数据加密加入命名规范完整代码总结前言 本地存储是前端开发过程中经常会用到的技术,但是官方api在使用上多有不便...
    99+
    2022-11-12
  • Spring main方法中如何调用Dao层和Service层的方法
    目录Springmain方法调用Dao层和Service层的方法如何在普通类中直接访问service层或dao层第一种方案第二种方案Spring main方法调用Dao层和Servi...
    99+
    2022-11-12
  • Vue2.x通用编辑组件如何封装及应用
    这篇文章主要介绍了Vue2.x通用编辑组件如何封装及应用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下效果 组件源码&...
    99+
    2022-10-19
  • 详解如何利用Golang泛型提高编码效率
    目录前言工具函数数据结构模板代码对象池/缓存总结前言 Golang的泛型已经出来有一段时间了,大家应该或多或少对它有所了解,甚至已经在应用中使用它。虽然Golang的泛型在功能上确实...
    99+
    2023-05-14
    Golang泛型提高编码效率 Golang泛型提高效率 Golang 泛型
  • 基于Pydantic封装的通用模型在API请求验证中的应用详解
    目录引言通用modelMixin 模式组合模式结论杂谈引言 Pydantic 是一个用于数据验证和解析的流行库,经常被用于 FastAPI 和其他现代 Python 项目中。在处理 ...
    99+
    2023-05-18
    Pydantic封装API请求验证 Pydantic通用模型封装
  • vue如何封装一个高质量的表单通用组件
    这篇“vue如何封装一个高质量的表单通用组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何封装一个高质量的表单通用...
    99+
    2023-07-05
  • C++下如何将TensorFlow模型封装成DLL供C#调用
    目录生成dll使用C#调用dll生成dllIDE使用visual studio 2015。首先新建一个C++win32工程,选择dll,包括导出符号,但不要预编译头。模板会提供一个工...
    99+
    2022-11-13
    C++ TensorFlow模型 TensorFlow模型封装DLL C#调用DLL
  • 如何封装一个好用的axios
    这篇文章主要介绍了如何封装一个好用的axios的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何封装一个好用的axios文章都会有所收获,下面我们一起来看看吧。通用能力列一下我想要这个通用请求能达到什么样的效果...
    99+
    2023-07-02
  • python自己封装的类如何调用
    要调用自己封装的类,需要按照以下步骤进行操作:1. 在代码中导入自己封装的类。例如,如果你的类定义在一个名为`myclass.py`...
    99+
    2023-08-24
    python
  • 如何利用VB.NET数据库访问方法封装到类实现
    这期内容当中小编将会给大家带来有关如何利用VB.NET数据库访问方法封装到类实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我们都知道,线程要执行的方法不能接受任何参数,如果要传入方法特定条件,可以将方...
    99+
    2023-06-17
  • 如何在Java项目中利用post请求对Json进行封装
    如何在Java项目中利用post请求对Json进行封装?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。直接上代码String longUrl = ...
    99+
    2023-05-31
    json java post
  • 如何使用vue组件封装共用的组件
    这篇文章主要介绍了如何使用vue组件封装共用的组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用vue组件封装共用的组件文章都会有所收获,下面我们一起来看看吧。这里提供两种vue封装共用组件的方法方法一...
    99+
    2023-06-30
  • java泛型的含义是什么及如何使用
    这篇“java泛型的含义是什么及如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java泛型的含义是什么及如何使用”文...
    99+
    2023-06-27
  • Vue前端如何对axios的封装和使用
    这篇文章将为大家详细讲解有关Vue前端如何对axios的封装和使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Axios 是一个基于 promise 的 HTTP 库。...
    99+
    2022-10-19
  • 如何使用原生js封装的ajax实例
    这篇文章主要为大家展示了“如何使用原生js封装的ajax实例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用原生js封装的ajax实例”这篇文章吧。实例如...
    99+
    2022-10-19
  • 如何使用Vue的思想封装一个Storage
    目录背景功能目的想法来源实现setgetdeletePropertypreventExtensionshas总结背景 localStorage、sessionStorage 这两个...
    99+
    2022-11-12
  • 微信二次开发中使用Java如何实现封装各类型的消息
    本篇文章给大家分享的是有关微信二次开发中使用Java如何实现封装各类型的消息,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。第一步:找到com.wtz.message.respo...
    99+
    2023-05-31
    java 微信二次开发 封装
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作