開篇四連問
- 你是否懶得寫普通的增刪改查方法?
- 你是否不喜歡程式碼生成外掛的重複程式碼?
- 你是否渴望一個沒有冗餘程式碼的專案?
- 你是否渴望一行程式碼都不用寫就能完成一個簡單的模組?
元件由來
作為後端程式設計師,相信大家都寫過以下幾種程式碼:
- 根據主鍵查詢
- 多條件分頁查詢
- 插入
- 根據主鍵修改
- 根據主鍵刪除(單個或批量)
拋開業務來說,這幾種程式碼是我們專案中最最基本的程式碼了,每一個專案中都會出現大量的這種程式碼。那麼你的專案中這種程式碼你是怎麼寫的呢?
- 按照dao-service-controller的流程寫?
- copy一個現有的模組然後修修改改?
- 使用程式碼生成外掛?
- 自己封裝一個元件?
對於我個人來說,就是從上方四個步驟走過來的。剛剛開始學習Java的時候跟著老師的步驟從dao到service介面到實現類再到controller。等到參加工作的時候就覺得沒什麼大不了的了,直接copy後進行修改。工作一段時間以後覺得自己寫太累了然後就開始使用程式碼生成外掛。
但是使用外掛一段時間以後我覺得每個專案中存在的太多太多的冗餘程式碼了,單單進行全域性搜尋時一個方法名出現了幾十次,如果有一個外掛的程式碼需要修改那麼就要修改幾十次,稍不注意就給自己挖了個坑等等。然後呢我就在想,既然這些都是冗餘方法那麼我何不自己封裝一個元件把這些東西都抽象出來做一個元件。以後開發時我只維護這一個元件,把剩餘的精力放到業務程式碼上呢?
我封裝的什麼元件?
元件名稱:syj-minicode
當一些單表的增刪改查時你只需要告訴前端來呼叫這幾個介面就行了
下方出現的entityName為當前操作的物件名稱或者資料庫表名稱(注意命名規範要符合駝峰命名法,例如:UserOrder或者user_order都可以) 刪除介面為物理刪除,邏輯刪除請使用update介面
- 根據主鍵查詢物件
@RequestMapping(value = "/syj-api/{entityName}/{id}", method = RequestMethod.GET)
複製程式碼
- 分頁查詢
@RequestMapping(value = "/syj-api/{entityName}/page", method = RequestMethod.POST)
@RequestBody: GridPageRequest
複製程式碼
這裡的GridPageRequest為分頁查詢的條件,看一下它的組成元素
/**
* 查詢關鍵字Map
*/
private Map<String, String> searchMap;
/**
* 模糊查詢關鍵字Map
*/
private Map<String, String> likeSearchMap;
/**
* 排序關鍵字Map
*/
private Map<String, String> orderMap;
/**
* 分組關鍵字陣列
*/
private String[] groupArray;
private int pageNum;
private int pageSize;
複製程式碼
前端查詢時只需要按照查詢條件組裝GridPageRequest物件就可以了 3. 插入
@RequestMapping(value = "/syj-api/{entityName}/insert", method = RequestMethod.POST)
@RequestBody: Object(待插入物件)
複製程式碼
- 根據主鍵進行更新
@RequestMapping(value = "/syj-api/{entityName}/update", method = RequestMethod.PUT)
@RequestBody: Object(待更新物件)
複製程式碼
- 根據主鍵進行刪除
@RequestMapping(value = "/syj-api/{entityName}/{id}", method = RequestMethod.DELETE)
複製程式碼
- 批量刪除
@RequestMapping(value = "/syj-api/{entityName}/deleteByIds", method = RequestMethod.DELETE)
@RequestBody: List<String> ids(待刪除主鍵列表)
複製程式碼
擴充套件介面
-
因為預設情況下單個物件查詢、修改、刪除所依據的主鍵的欄位名使用的都是"id",但是很可能有的專案使用的是userId、orderId、roleId等主鍵,如果你的專案符合這個條件注入下方這個bean。
@Bean public IdField idField() { Map<String,String> map=new ConcurrentHashMap<>(); map.put("user","userId");//key的名稱為實體名稱或資料庫表名稱,value為主鍵屬性名 map.put("order","orderId"); map.put("role","roleId"); IdField idField=new IdField(); idField.setMap(map); return idField; } 複製程式碼
-
有的專案在進行插入和更新時會加入建立人和修改人等資訊。如果有此需求請按照如下方式呼叫
- 插入擴充套件
建立一個名為InsertExtend的bean並實現DefaultExtend介面
@Component public class InsertExtend implements ExtendInterface{ @Override public Map<String, String> exectue() { Map<String, String> map=new HashMap<>(); map.put("createTime", System.currentTimeMillis()); map.put("createBy", "建立人id"); map.put("createUserName", "建立人名稱"); return map; } } 複製程式碼
- 更新擴充套件
建立一個名為UpdateExtend的bean並實現DefaultExtend介面
@Component public class UpdateExtend implements ExtendInterface{ @Override public Map<String, String> exectue() { Map<String, String> map=new HashMap<>(); map.put("updateTime", System.currentTimeMillis()); map.put("updateBy", "修改人id"); map.put("updateUserName", "修改人名稱"); return map; } } 複製程式碼
還有沒有更靈活的使用方式?
上方使用方式其實是直接抽象到了controller層,解決一般的需要是沒問題的,但是我們是有業務邏輯的,那麼存在業務邏輯的情況下如何使用呢? 你可以在處理完業務邏輯後在service中呼叫
- 初始化
private BaseService getUserBaseService(){ return ServiceBeanFactory.getBean("User"); } 複製程式碼
- 根據id查詢
Map<String,Object> userMap=getUserBaseService().selectOneById("115"); User user=(User) BeanMapUtil.mapToBean(map,User.class); 複製程式碼
- 根據條件查詢列表(相信你已經知道了gridPageRequest物件如何組裝)
List<Map<String, Object>> userMaps=getUserBaseService().selectBySelective(gridPageRequest); for (Map<String, Object> map:userMaps){ User user=(User) BeanMapUtil.mapToBean(map,User.class); } 複製程式碼
- 插入
getUserBaseService().insertSelective(user); 複製程式碼
- 更新
getUserBaseService().updateByIdSelective(user); 複製程式碼
- 刪除
getUserBaseService().deleteById("115"); 複製程式碼
- 批量刪除
List<String> list=new ArrayList<>(); list.add("115"); list.add("116"); list.add("117"); getUserBaseService().deleteByIds(list); 複製程式碼
元件好用麼?
看完我的介紹你覺得這個元件能滿足你的基本需要麼,如果可以話請移步下方的GitHub連結看一下這個元件的原始碼寫的如何以及如何使用吧。