基於Springboot的BaseService,BaseControllerhtml
前言:前端
在作項目時須要對大量的表作增刪查改,而其中的邏輯大同小異,因此抽象了一個 BaseService,BaseController來實現全部表的增刪查改和一些公用的基礎方法。java
UML類圖:git
大致的思路就是在BaseService和BaseController中都使用泛型,到真正建立類的時候才知道具體的對象,對對象進行操做。github
代碼以下:web
BaseEnity(須要使用BaseService方法的實體必須實現這些抽象方法)spring
package com.honeywell.tms.entity.base; public abstract class BaseEntity { public abstract boolean ValidateEmpty(); public abstract boolean ValidateUnique(); public abstract boolean AutoFill(); public abstract Object getKey(); public abstract String getText(); }
BaseMapperapache
逆向後獲得的mapper方法都是相同的,因此我把它抽象出來了。編程
package com.honeywell.tms.dao.base; import com.honeywell.tms.entity.CompanyEntity; import com.honeywell.tms.entity.base.BaseEntity; import org.apache.ibatis.annotations.Param; import java.util.List; //全部被BaseService方法調用的dao都須要實現這個接口 public interface BaseMapper<E extends BaseEntity> { int deleteByPrimaryKey(@Param(value="ID")Object ID);//在Mapper文件中的佔位符的關鍵字就是value的值 int insert(E record); int insertSelective(E record); E selectByPrimaryKey(@Param(value="ID") Object ID); List<E> selectAll(); int updateByPrimaryKeySelective(E record); int updateByPrimaryKey(E record); }
BaseService方法以下json
package com.honeywell.tms.service.base; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.honeywell.tms.dao.base.BaseMapper; import com.honeywell.tms.entity.base.BaseEntity; import com.honeywell.tms.entity.base.ResponseEntity; import com.honeywell.tms.entity.base.ValueTextEntity; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class BaseService<E extends BaseEntity> {//一些提取了一些公用的Service方法,使用前必須經過init()方法注入相應的Mapper BaseMapper dao; //在子類構造函數中調用,指明具體的dao層 public void init(BaseMapper mapper){ dao=mapper; } //分頁獲取 public ResponseEntity getByPage(int pageNum,int pageSize) { PageHelper.startPage(pageNum,pageSize,true); ResponseEntity responseEntity=new ResponseEntity(); List<E> pageList=dao.selectAll();//這個不是獲取到的entity的集合了 PageInfo<E> entityList=new PageInfo<>(pageList); pageList=entityList.getList(); long count=entityList.getTotal();; responseEntity.setData(pageList); responseEntity.setTotal(String.valueOf(count)); return responseEntity; } //批量增長 public ResponseEntity batchSave(List<E> list) { ResponseEntity responseEntity=new ResponseEntity(); StringBuffer message=new StringBuffer(); int row=0; for(E j:list){ row++; if(!j.ValidateEmpty()){ message.append("第"+row+"行插入失敗,請檢查是否有違規的空值+\n"); continue; } if(!j.ValidateUnique()){ message.append("第"+row+"行已經存在,插入失敗\n"); } j.AutoFill(); dao.insert(j); } responseEntity.setMessage(message.toString()); return responseEntity; } //批量更新 public ResponseEntity batchUpdate(List<E> list) { ResponseEntity responseEntity=new ResponseEntity(); StringBuffer message=new StringBuffer(); int row=0; for(E j:list){ row++; if(!j.ValidateEmpty()){ message.append("第"+row+"行更新失敗,請檢查是否有違規的空值+\n"); continue; } if(!j.ValidateUnique()) { message.append("第" + row + "行已經存在,更新失敗\n"); } j.AutoFill(); StringToUUID(j); int back=dao.updateByPrimaryKeySelective(j);//不爲空的才更新,爲空的不更新。 System.out.println(back); } responseEntity.setMessage(message.toString()); return responseEntity; } //批量刪除 public ResponseEntity batchDestroy(List<E> list) { ResponseEntity responseEntity=new ResponseEntity(); StringBuffer message=new StringBuffer(); int row=0; for(E j:list) { row++; try{ StringToUUID(j); int count=dao.deleteByPrimaryKey(j.getKey()); }catch (Exception e){ System.out.println(e.getMessage()); message.append("第"+row+"刪除失敗,請先刪除相關引用\n"); } } responseEntity.setMessage(message.toString()); return responseEntity; } //獲取ValueText模型 public ResponseEntity getVTModel(){ ResponseEntity responseEntity=new ResponseEntity(); List<E> list=dao.selectAll(); List<ValueTextEntity> vtList=new ArrayList<>(); for(E j:list){ ValueTextEntity vtEntity=new ValueTextEntity(); vtEntity.setText(j.getText()); vtEntity.setValue(j.getKey().toString()); vtList.add(vtEntity); } responseEntity.setListData(vtList); return responseEntity; } //將前端頁面傳來的字符串轉爲UUID,前提條件是相應屬性的名稱必須包含"ID" public Object StringToUUID(Object obj ){ Field[] fields=obj.getClass().getDeclaredFields(); try { for (Field field : fields) { field.setAccessible(true); if (field.getName().contains("ID")) { Object value = field.get(obj); Object uid= UUID.fromString(value.toString()); field.set(obj,uid); } } }catch (Exception e){ System.out.println(e.getMessage()); } return null; } }
BaseController
package com.honeywell.tms.controller.base; import com.alibaba.fastjson.JSONArray; import com.honeywell.tms.entity.CompanyEntity; import com.honeywell.tms.entity.base.BaseEntity; import com.honeywell.tms.entity.base.ResponseEntity; import com.honeywell.tms.service.base.BaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.ParameterizedType; import java.util.*; public class BaseController<E extends BaseEntity> { private BaseService<E> service; private static final String models="models"; //初始化 public void init(BaseService service){ this.service=service; } //查詢 public Map Read(HttpServletRequest request){ String pageSkip=request.getParameter("pageSkip"); String pageSize=request.getParameter("pageSize"); int skip=Integer.valueOf(pageSkip); int size=Integer.valueOf(pageSize); int pageNum=skip/size+1; ResponseEntity responseEntity=service.getByPage(pageNum,size); return responseEntity.getMap(); } //增長 public Map Create(HttpServletRequest request){ ResponseEntity responseEntity;//返回的實體 List<E> dataList=getModel(request); responseEntity=service.batchSave(dataList); responseEntity.setData(dataList); return responseEntity.getMap(); } //更新 public Map Update(HttpServletRequest request){ ResponseEntity responseEntity;//返回的實體 List<E> dataList=getModel(request); responseEntity=service.batchUpdate(dataList); responseEntity.setData(dataList); return responseEntity.getMap(); } //刪除 public Map Destroy(HttpServletRequest request){ ResponseEntity responseEntity;//返回的實體 List<E> dataList=getModel(request); responseEntity=service.batchDestroy(dataList); return responseEntity.getMap(); } //獲取ValueText模型 public List getVTModel(){ ResponseEntity responseEntity=service.getVTModel(); return responseEntity.getListData(); } //從request中獲取實體 public List<E> getModel(HttpServletRequest request){ String json=request.getParameter(models); return JSONArray.parseArray(json,createModel()); } //獲取實列的類信息 public Class createModel() { try { ParameterizedType ptype = (ParameterizedType) this.getClass().getGenericSuperclass(); Class clazz = (Class<E>) ptype.getActualTypeArguments()[0]; E o = (E) clazz.newInstance(); return o.getClass(); }catch (Exception e){ System.out.println(e.getMessage()); } return null; } }
使用(用了公司這個實體舉例)
公司的實體:
package com.honeywell.tms.entity; import com.honeywell.tms.dao.CompanyMapper; import com.honeywell.tms.entity.base.BaseEntity; import org.springframework.beans.factory.annotation.Autowired; import java.util.Date; import java.util.UUID; public class CompanyEntity extends BaseEntity { @Autowired CompanyMapper dao; private Object COMPANY_ID; private String COMPANY_CODE; private String COMPANY_NAME; private String COMPANY_ADDR; private String CREATED_BY; private String UPDATE_BY; private Date CREATED_DATE; private Date UPDATE_DATE; public Object getCOMPANY_ID() { return COMPANY_ID; } public void setCOMPANY_ID(Object COMPANY_ID) { this.COMPANY_ID=COMPANY_ID; } public String getCOMPANY_CODE() { return COMPANY_CODE; } public void setCOMPANY_CODE(String COMPANY_CODE) { this.COMPANY_CODE = COMPANY_CODE == null ? null : COMPANY_CODE.trim(); } public String getCOMPANY_NAME() { return COMPANY_NAME; } public void setCOMPANY_NAME(String COMPANY_NAME) { this.COMPANY_NAME = COMPANY_NAME == null ? null : COMPANY_NAME.trim(); } public String getCOMPANY_ADDR() { return COMPANY_ADDR; } public void setCOMPANY_ADDR(String COMPANY_ADDR) { this.COMPANY_ADDR = COMPANY_ADDR == null ? null : COMPANY_ADDR.trim(); } public String getCREATED_BY() { return CREATED_BY; } public void setCREATED_BY(String CREATED_BY) { this.CREATED_BY = CREATED_BY == null ? null : CREATED_BY.trim(); } public String getUPDATE_BY() { return UPDATE_BY; } public void setUPDATE_BY(String UPDATE_BY) { this.UPDATE_BY = UPDATE_BY == null ? null : UPDATE_BY.trim(); } public Date getCREATED_DATE() { return CREATED_DATE; } public void setCREATED_DATE(Date CREATED_DATE) { this.CREATED_DATE = CREATED_DATE; } public Date getUPDATE_DATE() { return UPDATE_DATE; } public void setUPDATE_DATE(Date UPDATE_DATE) { this.UPDATE_DATE = UPDATE_DATE; } @Override public boolean ValidateEmpty() { if(this.COMPANY_CODE==null||this.COMPANY_CODE.equals("")){ return false; } if(this.COMPANY_NAME==null||this.COMPANY_NAME.equals("")){ return false; } return true; } @Override public boolean ValidateUnique() { return true; } @Override public boolean AutoFill(){ //ID爲空說明是新增操做, if(getCOMPANY_ID()==null){ this.setCOMPANY_ID(UUID.randomUUID()); this.setCREATED_BY("admin"); this.setCREATED_DATE(new Date()); } this.setUPDATE_BY("admin"); this.setUPDATE_DATE(new Date()); return true; } @Override public Object getKey() { return this.COMPANY_ID; } @Override public String getText() { return this.COMPANY_NAME; } }
公司的mapper,只須要繼承BaseMapper
package com.honeywell.tms.dao; import com.honeywell.tms.dao.base.BaseMapper; import com.honeywell.tms.entity.CompanyEntity; import com.honeywell.tms.entity.base.BaseEntity; public interface CompanyMapper extends BaseMapper<CompanyEntity> { }
公司的Service
(繼承BaseService,指明相應的實體,構造注入相應的Service)
package com.honeywell.tms.service; import com.honeywell.tms.dao.CompanyMapper; import com.honeywell.tms.entity.CompanyEntity; import com.honeywell.tms.service.base.BaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class CompanyService extends BaseService<CompanyEntity> { private CompanyMapper dao;//若是此處出現紅色波浪線 Settings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class 勾去掉 @Autowired public CompanyService(CompanyMapper mapper){//這裏必需要使用構造注入。 this.dao=mapper; init(dao); } }
公司的Controller
(繼承BaseController並構造注入相應的Service就好了,必定要構造注入喲。這裏其實映射也能夠寫在BaseController裏面,可是項目用了Swagger,它不支持。)
package com.honeywell.tms.controller; import com.honeywell.tms.controller.base.BaseController; import com.honeywell.tms.entity.CompanyEntity; import com.honeywell.tms.service.CompanyService; import com.honeywell.tms.service.base.BaseService; import com.honeywell.tms.utils.consts.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @Api(value="/Company",tags = "公司模塊") @RestController @RequestMapping("/Company") public class CompanyController extends BaseController<CompanyEntity> {//繼承BaseController後能夠調用一些基本的方法,不過須要注入相應的Service private CompanyService service; @Autowired public CompanyController(CompanyService service){ init(service); } @RequestMapping("/DownloadTemplate") @ApiOperation(value = "公司模板下載",notes = "直接下載excel模板") @ResponseBody public void DownloadTemplate(HttpServletResponse httpServletResponse){ return; } @RequestMapping("/Read") public Map Read(HttpServletRequest request){ return super.Read(request); } @RequestMapping("Create") public Map Create(HttpServletRequest request){ return super.Create(request); } @RequestMapping("/Update") public Map Update(HttpServletRequest request){ return super.Update(request); } @RequestMapping("/Destroy") public Map Destroy(HttpServletRequest request) { return super.Destroy(request); } @RequestMapping("/getVTModel") public List getVTModel(HttpServletRequest request){ return super.getVTModel(); } }
總結:整體來講較爲滿意的,可以實現基本的增刪改查和一些基本的方法。缺點是大多都是用繼承,沒有面向接口編程。UML類圖畫的不夠好,有什麼意見或修改的地方請多多指教。
原文出處:https://www.cnblogs.com/c-lover/p/11380912.html