開篇四連問
你是否懶得寫普通的增刪改查方法?
你是否不喜歡代碼生成插件的重復(fù)代碼?
你是否渴望一個(gè)沒有冗余代碼的項(xiàng)目?
你是否渴望一行代碼都不用寫就能完成一個(gè)簡單的模塊?
組件由來
作為后端程序員,相信大家都寫過以下幾種代碼:
根據(jù)主鍵查詢
多條件分頁查詢
插入
根據(jù)主鍵修改
根據(jù)主鍵刪除(單個(gè)或批量)
拋開業(yè)務(wù)來說,這幾種代碼是我們項(xiàng)目中最最基本的代碼了,每一個(gè)項(xiàng)目中都會出現(xiàn)大量的這種代碼。那么你的項(xiàng)目中這種代碼你是怎么寫的呢?
按照dao-service-controller的流程寫?
copy一個(gè)現(xiàn)有的模塊然后修修改改?
使用代碼生成插件?
自己封裝一個(gè)組件?
對于我個(gè)人來說,就是從上方四個(gè)步驟走過來的。剛剛開始學(xué)習(xí)Java的時(shí)候跟著老師的步驟從dao到service接口到實(shí)現(xiàn)類再到controller。等到參加工作的時(shí)候就覺得沒什么大不了的了,直接copy后進(jìn)行修改。工作一段時(shí)間以后覺得自己寫太累了然后就開始使用代碼生成插件。
但是使用插件一段時(shí)間以后我覺得每個(gè)項(xiàng)目中存在的太多太多的冗余代碼了,單單進(jìn)行全局搜索時(shí)一個(gè)方法名出現(xiàn)了幾十次,如果有一個(gè)插件的代碼需要修改那么就要修改幾十次,稍不注意就給自己挖了個(gè)坑等等。然后呢我就在想,既然這些都是冗余方法那么我何不自己封裝一個(gè)組件把這些東西都抽象出來做一個(gè)組件。以后開發(fā)時(shí)我只維護(hù)這一個(gè)組件,把剩余的精力放到業(yè)務(wù)代碼上呢?
我封裝的什么組件?
組件名稱:syj-minicode
當(dāng)一些單表的增刪改查時(shí)你只需要告訴前端來調(diào)用這幾個(gè)接口就行了
下方出現(xiàn)的entityName為當(dāng)前操作的對象名稱或者數(shù)據(jù)庫表名稱(注意命名規(guī)范要符合駝峰命名法,例如:UserOrder或者user_order都可以) 刪除接口為物理刪除,邏輯刪除請使用update接口
根據(jù)主鍵查詢對象
@RequestMapping(value = "/syj-api/{entityName}/{id}", method = RequestMethod.GET)
分頁查詢
@RequestMapping(value = "/syj-api/{entityName}/page", method = RequestMethod.POST)
@RequestBody: GridPageRequest
這里的GridPageRequest為分頁查詢的條件,看一下它的組成元素
/**
查詢關(guān)鍵字Map
*/
private Map
/**
模糊查詢關(guān)鍵字Map
*/
private Map
/**
排序關(guān)鍵字Map
*/
private Map
/**
分組關(guān)鍵字?jǐn)?shù)組
*/
private String[] groupArray;
private int pageNum;
private int pageSize;
前端查詢時(shí)只需要按照查詢條件組裝GridPageRequest對象就可以了
插入
@RequestMapping(value = "/syj-api/{entityName}/insert", method = RequestMethod.POST)
@RequestBody: Object(待插入對象)
根據(jù)主鍵進(jìn)行更新
@RequestMapping(value = "/syj-api/{entityName}/update", method = RequestMethod.PUT)
@RequestBody: Object(待更新對象)
根據(jù)主鍵進(jìn)行刪除
@RequestMapping(value = "/syj-api/{entityName}/{id}", method = RequestMethod.DELETE)
批量刪除
@RequestMapping(value = "/syj-api/{entityName}/deleteByIds", method = RequestMethod.DELETE)
@RequestBody: List
擴(kuò)展接口
因?yàn)槟J(rèn)情況下單個(gè)對象查詢、修改、刪除所依據(jù)的主鍵的字段名使用的都是"id",但是很可能有的項(xiàng)目使用的是userId、orderId、roleId等主鍵,如果你的項(xiàng)目符合這個(gè)條件注入下方這個(gè)bean。
@Bean
public IdField idField() {
Mapmap=new ConcurrentHashMap<>(); map.put("user","userId");//key的名稱為實(shí)體名稱或數(shù)據(jù)庫表名稱,value為主鍵屬性名 map.put("order","orderId"); map.put("role","roleId"); IdField idField=new IdField(); idField.setMap(map); return idField;
}
有的項(xiàng)目在進(jìn)行插入和更新時(shí)會加入創(chuàng)建人和修改人等信息。如果有此需求請按照如下方式調(diào)用
插入擴(kuò)展
創(chuàng)建一個(gè)名為InsertExtend的bean并實(shí)現(xiàn)DefaultExtend接口
@Component
public class InsertExtend implements ExtendInterface{
@Override public Mapexectue() { Map map=new HashMap<>(); map.put("createTime", System.currentTimeMillis()); map.put("createBy", "創(chuàng)建人id"); map.put("createUserName", "創(chuàng)建人名稱"); return map; }
}
更新擴(kuò)展
創(chuàng)建一個(gè)名為UpdateExtend的bean并實(shí)現(xiàn)DefaultExtend接口
@Component
public class UpdateExtend implements ExtendInterface{
@Override public Mapexectue() { Map map=new HashMap<>(); map.put("updateTime", System.currentTimeMillis()); map.put("updateBy", "修改人id"); map.put("updateUserName", "修改人名稱"); return map; }
}
還有沒有更靈活的使用方式?
上方使用方式其實(shí)是直接抽象到了controller層,解決一般的需要是沒問題的,但是我們是有業(yè)務(wù)邏輯的,那么存在業(yè)務(wù)邏輯的情況下如何使用呢?
你可以在處理完業(yè)務(wù)邏輯后在service中調(diào)用
初始化
private BaseService getUserBaseService(){
return ServiceBeanFactory.getBean("User"); }
根據(jù)id查詢
Map
User user=(User) BeanMapUtil.mapToBean(map,User.class);
根據(jù)條件查詢列表(相信你已經(jīng)知道了gridPageRequest對象如何組裝)
List
User user=(User) BeanMapUtil.mapToBean(map,User.class);
}
插入
getUserBaseService().insertSelective(user);
更新
getUserBaseService().updateByIdSelective(user);
刪除
getUserBaseService().deleteById("115");
批量刪除
List
list.add("115");
list.add("116");
list.add("117");
getUserBaseService().deleteByIds(list);
組件好用么?
看完我的介紹你覺得這個(gè)組件能滿足你的基本需要么,如果可以話請移步下方的GitHub鏈接看一下這個(gè)組件的源碼寫的如何以及如何使用吧。
https://github.com/2388386839...
本文出自http://zhixiang.org.cn,轉(zhuǎn)載請...。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71726.html
摘要:語言誕生于谷歌,由計(jì)算機(jī)領(lǐng)域的三位宗師級大牛和寫成。作者華為云技術(shù)宅基地鏈接谷歌前員工認(rèn)為,比起大家熟悉的,語言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替,他已經(jīng)在很多任務(wù)中使用語言替代了。 Go 語言誕生于谷歌,由計(jì)算機(jī)領(lǐng)域的三位宗師級大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 寫成。由于出身名門,Go 在誕生之初就吸引了大批開發(fā)者的關(guān)注。誕生...
摘要:本使用創(chuàng)建本地服務(wù)器,在就能完成全部流程,并不需要線上服務(wù)器。路徑要與后端接口一致。后端返回成功后,前端數(shù)據(jù)中對應(yīng)的元素也要?jiǎng)h掉,更新視圖。控制器里拿一個(gè)方法出來說一下吧,完整的代碼都在。讀取操作完成后調(diào)用釋放連接。 寫在前面 本文只是本人學(xué)習(xí)過程的一個(gè)記錄,并不是什么非常嚴(yán)謹(jǐn)?shù)慕坛蹋M痛蠹乙黄鸸餐M(jìn)步。也希望大家能指出我的問題。適合有一定基礎(chǔ),志在全棧的前端初學(xué)者學(xué)習(xí),從點(diǎn)擊按鈕...
摘要:框架這部分是小程序開發(fā)的核心,小程序采用視圖和邏輯層代碼相分離的結(jié)構(gòu),如果你用過這部分也不難理解,但是也有一些區(qū)別。工具這部分沒有什么好說的,微信開發(fā)開始還是用微信自己的開發(fā)工具比較方便。 小程序開發(fā)文檔使用說明 小程序的文檔分為 簡易教程、框架、組件、API?、工具h(yuǎn)ttps://developers.weixin.qq.... 簡易教程---介紹小程序開發(fā)的一些基本情況 開發(fā)方式...
閱讀 3157·2021-11-22 14:45
閱讀 3306·2019-08-29 13:11
閱讀 2309·2019-08-29 12:31
閱讀 927·2019-08-29 11:21
閱讀 2995·2019-08-29 11:09
閱讀 3624·2019-08-28 18:11
閱讀 1424·2019-08-26 13:58
閱讀 1279·2019-08-26 13:27