溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么利用泛型封裝通用的service層

發(fā)布時間:2022-06-22 09:45:50 來源:億速云 閱讀:241 作者:iii 欄目:開發(fā)技術(shù)

這篇“怎么利用泛型封裝通用的service層”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么利用泛型封裝通用的service層”文章吧。

身為一名開發(fā)人員,大家都知道,我們經(jīng)常會在項目中大量的編寫許多重復(fù)的代碼,比如說

public Entity find(String id);

像這種代碼,簡單,但是寫多了,可能也會容易出錯,那么我們能不能直接編寫一套完整的,通用的方法呢,這樣既不用重復(fù)編寫,還不用出錯,說道通用的方法,泛型是個不錯的選擇.

基礎(chǔ)架構(gòu):spring-boot+spring mvc+spring jpa.

jpa是個好東西,個人感覺它最大的好處是不需要自己手動建表.還能在修改了表字段以后,自動給你添加上上去,它不像mybatis,業(yè)務(wù)改了之后,還需要調(diào)整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;
 
/**
 * @Author : yuanxw
 * @Description: 所有實體的父類
 * @Date: Created in 17:03 2018/5/15
 */
@MappedSuperclass
public abstract class BaseEntity implements Serializable{
 
    /**
     * id
     */
    @Id
    @Column(length = 32 )
    private String id;
 
    /**
     * 創(chuàng)建時間
     */
    private Date createTime;
 
    /**
     * 創(chuàng)建人
     */
    @Column(length = 32 )
    private String createUser;
 
    /**
     * 更新時間
     */
    private Date updateTime;
 
    /**
     * 更新人
     */
    @Column(length = 32 )
    private String updateUser;
 
    /**
     * 刪除標記 --系統(tǒng)只做邏輯刪除
     */
    @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;
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 15:16 2018/6/20
 */
@Entity()
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "web_visit_Record")
public class WebVisitRecordEntity extends BaseEntity {
 
    private static final long serialVersionUID = 341666498307329777L;
    /**
     * 訪問次數(shù)
     */
    private int count = 0;
 
    public int getCount() {
        return count;
    }
 
    public void setCount(int count) {
        this.count = count;
    }
}

二、有了實體類之后

首先建立一個頂層的api接口。所有通用的api方法,可以放在這里(ResultBean是一個封裝了一個結(jié)果的數(shù)據(jù)類,里面包含了定義執(zhí)行是否成功,執(zhí)行返回的數(shù)據(jù),執(zhí)行錯誤提示的消息)

package cn.yxw.function; 
import cn.yxw.function.result.ResultBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 10:32 2018/5/25
 */
public interface BaseApi<T extends BaseEntity> {
 
    /**
     * 查詢
     * @param id
     * @return
     */
    T get(String id);
 
    /**
     * 查詢
     * @param id
     * @return
     */
    T find(String id);
 
    /**
     * 刪除
     * @param id
     * @return
     */
    ResultBean<T> delete(String id);
 
    ResultBean<T> delete(T entity);
 
    /**
     * 創(chuàng)建
     * @param entity
     * @return
     */
    ResultBean<T> create(T entity);
 
    /**
     * 更新
     * @param entity
     * @return
     */
    ResultBean<T> update(T entity);
 
    /**
     * 讀取所有
     * @param pageable
     * @return
     */
    Page<T> page(Pageable pageable);
 
    /**
     * 判斷id是否存在
     * @param id
     * @return
     */
    boolean exists(String id);
 
}

三、實現(xiàn)BaseApi

既然是要定義通用的api,那么不僅僅只是一套接口,我們需要在定義一個可以實現(xiàn)BaseApi的BaseServiceImpl,之后的所有實現(xiàn)類,都可以繼承這個BaseServiceImpl.java的泛型,給了我們的項目很好的擴展性,而頂層BaseEntity也給了我很好的實現(xiàn)方案,將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; 
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 14:31 2018/6/20
 */
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;
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 14:31 2018/6/20
 */
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("數(shù)據(jù)為空,無法創(chuàng)建!");
        }
        if(this.exists(entity.getId())){
            return ResultBean.failfure("實體id相同,無法重復(fù)創(chuàng)建!");
        }
        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("數(shù)據(jù)為空,無法創(chuàng)建!");
        }
        if(!this.exists(entity.getId())){
            return ResultBean.failfure("數(shù)據(jù)庫不存在該數(shù)據(jù),無法執(zhí)行更新");
        }
        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,定義實現(xiàn)類,繼承BaseServiceImpl.并實現(xiàn)自己的api

package cn.yxw.function.domain.userCenter; 
import cn.yxw.function.BaseApi;
import cn.yxw.function.domain.plugins.WebVisitRecordEntity;
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 14:44 2018/6/22
 */
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;
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 15:22 2018/6/20
 */
@Service
public class WebVisitRecordServiceImpl extends BaseServiceImpl<WebVisitRecordEntity> implements WebVisitRecordApi {   
}

五、測試

到這里,代碼已經(jīng)結(jié)束. 測試一下,構(gòu)建下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;
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 15:23 2018/6/20
 */
@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("參數(shù)不得為空");
        }
        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("參數(shù)不得為空");
        }
        WebVisitRecordEntity entity = this.webVisitRecordService.find(id);
        if(ObjectUtil.isNull(entity)){
            return this.errorWithMsg("不存在該數(shù)據(jù)");
        }
        entity.setUpdateTime(new Date());
        entity.setCount(entity.getCount()+num);
        ResultBean<WebVisitRecordEntity> result = this.webVisitRecordService.update(entity);
        return this.result(result.getDate(),result.getMsg());
    } 
}

怎么利用泛型封裝通用的service層

三次測試都已經(jīng)成功,但是我們真實的項目不可能這么簡單.所以我們再次測試下擴展性

等等,不知道你們發(fā)現(xiàn)沒有,上面的代碼有一段是錯誤的.

我在controller層的屬性不是api,而是實現(xiàn)類.......

雖然不影響,但是就無法擴展了...此處做修正

怎么利用泛型封裝通用的service層

六、擴展性

1. WebVisitRecordApi

package cn.yxw.function.domain.userCenter; 
import cn.yxw.function.BaseApi;
import cn.yxw.function.domain.plugins.WebVisitRecordEntity;
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 14:44 2018/6/22
 */
public interface WebVisitRecordApi extends BaseApi<WebVisitRecordEntity> {
 
    /**
     * 統(tǒng)計所有的記錄之和
     * @return
     */
    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;
 
/**
 * @Author : yuanxw
 * @Description:
 * @Date: Created in 15:22 2018/6/20
 */
@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(),"執(zhí)行成功");
    }

4.測試

怎么利用泛型封裝通用的service層

以上就是關(guān)于“怎么利用泛型封裝通用的service層”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI