您好,登錄后才能下訂單哦!
這篇“怎么利用泛型封裝通用的service層”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么利用泛型封裝通用的service層”文章吧。
身為一名開發人員,大家都知道,我們經常會在項目中大量的編寫許多重復的代碼,比如說
public Entity find(String id);
像這種代碼,簡單,但是寫多了,可能也會容易出錯,那么我們能不能直接編寫一套完整的,通用的方法呢,這樣既不用重復編寫,還不用出錯,說道通用的方法,泛型是個不錯的選擇.
基礎架構:spring-boot+spring mvc+spring jpa.
jpa是個好東西,個人感覺它最大的好處是不需要自己手動建表.還能在修改了表字段以后,自動給你添加上上去,它不像mybatis,業務改了之后,還需要調整sql語句,
好了,廢話不多說,上代碼:
繼承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; /** * 創建時間 */ 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; /** * @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; /** * 訪問次數 */ 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; /** * @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); /** * 創建 * @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); }
既然是要定義通用的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; /** * @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("數據為空,無法創建!"); } 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); } }
繼承BaseApi,定義實現類,繼承BaseServiceImpl.并實現自己的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 { }
到這里,代碼已經結束. 測試一下,構建下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("參數不得為空"); } 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; /** * @Author : yuanxw * @Description: * @Date: Created in 14:44 2018/6/22 */ public interface WebVisitRecordApi extends BaseApi<WebVisitRecordEntity> { /** * 統計所有的記錄之和 * @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(),"執行成功"); }
4.測試
以上就是關于“怎么利用泛型封裝通用的service層”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。