你用過不寫代碼就能完成一個簡單模塊的組件麽?
阿新 • • 發佈:2018-10-16
object dpa 搜索 就是 pub ror ping 開始學習 ini 開篇四連問
- 你是否懶得寫普通的增刪改查方法?
- 你是否不喜歡代碼生成插件的重復代碼?
- 你是否渴望一個沒有冗余代碼的項目?
- 你是否渴望一行代碼都不用寫就能完成一個簡單的模塊?
組件由來
作為後端程序員,相信大家都寫過以下幾種代碼:
- 根據主鍵查詢
- 多條件分頁查詢
- 插入
- 根據主鍵修改
- 根據主鍵刪除(單個或批量)
拋開業務來說,這幾種代碼是我們項目中最最基本的代碼了,每一個項目中都會出現大量的這種代碼。那麽你的項目中這種代碼你是怎麽寫的呢?
- 按照dao-service-controller的流程寫?
- copy一個現有的模塊然後修修改改?
- 使用代碼生成插件?
- 自己封裝一個組件?
<br><br>
但是使用插件一段時間以後我覺得每個項目中存在的太多太多的冗余代碼了,單單進行全局搜索時一個方法名出現了幾十次,如果有一個插件的代碼需要修改那麽就要修改幾十次,稍不註意就給自己挖了個坑等等。然後呢我就在想,既然這些都是冗余方法那麽我何不自己封裝一個組件把這些東西都抽象出來做一個組件。以後開發時我只維護這一個組件,把剩余的精力放到業務代碼上呢?我封裝的什麽組件?
組件名稱: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對象就可以了
- 插入
@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鏈接看一下這個組件的源碼寫的如何以及如何使用吧。
GitHub
本文出自http://zhixiang.org.cn,轉載請保留。
你用過不寫代碼就能完成一個簡單模塊的組件麽?