公司是金融行業的,項目都是非常龐大,項目的各個層次划分的非常細,一個保存操作,就需要從jsp的form->action的vo->在service層convert成其他系統需要的vo->在dao中映射到xml(使用ibatis)->db。每次映射都要注意字段名稱是否一致,否則出錯,好累...
在實際中經常看到接私活的朋友,懷疑人家怎么那么快就可以做出項目,而我不行那,因此苦苦思考一款java領域的快速開發框架,首先想到的是hibernate。
這是個好東西,自動orm,基於HibernateDaoSupport可以寫泛型基類,因此只需要寫出model,就會自動生成數據庫、dao、service,甚至action、jsp都可以生成。
使用SpringMVC+Hibernate做了做進銷存,
發現了Hibernate的幾個問題:
(1)視圖支持不夠。Hibernate沒有視圖注解,不能自動生成,只能手工生成。
(2)對於中間表,hibernate必須有映射,其實java代碼里面可以不用,僅僅是中間表嘛,如角色和員工的中間表,就是兩個字段。
(3)復雜sql支持不夠,如果繞開hibernate寫sql,就是兩套思路,覺得沒必要。
(4)對於業務邏輯比較簡單的model,也要生成dao、service,里面沒有一個方法(都來自基類),但是也要有,覺得沒必要。
基於這幾個考慮,又琢磨出了目前的新框架:
新框架思路:jsp+SpringMVC+model,符合最基本的MVC分層,但絕不多分一層。
具體說說看:
(1)頁面使用jsp,因為jsp隨便找個搞java的基本都會寫,屬於最最基本的java web基本功。再配合tag,會節省很多前端開發代碼量和時間。
前端框架使用的是jeasyui,有extjs的展現風格,但是實現思路迥異,更接近普通的html寫法,非常喜歡這種朴素。
(2)action使用的是SpringMVC,配合REST寫法,更接近於http本質,寫起來非常舒服和直接,我覺得比Struts2來的更方便。
(3)model與數據庫是映射的,表名和model名一致,字段名和model屬性名一致,不區分大小寫。轉換是反射自動完成的,不需要額外代碼。
(4)DAO我覺得是亮點,使用的是DbUtils,但是不獨立出一個DAO層,把帶代碼寫在action的方法中,看一下幾個例子,是不是覺得會方便:
保存的例子,把頁面傳來的參數自動轉成model對象,直接寫sql保存,下面是新增和修改的例子,ajax請求。
1 @RequestMapping("/save") 2 public @ResponseBody Map<String, Object> save( PricePolicy model) { 3 if (model.getId()==null) { 4 Dao.insert("insert into pricePolicy(name, style, value)values(?,?,?)", model.getName(), model.getStyle(), model.getValue()); 5 } else { 6 Dao.update("update pricepolicy set name=?, style=?, value=? where id=?", model.getName(), model.getStyle(), model.getValue(), model.getId()); 7 } 8 return ActionHelper.ajaxOK(); 9 }
刪除的例子,ajax請求
1 @RequestMapping("/delete/{id}") 2 public @ResponseBody Map<String, Object> delete(@PathVariable("id")Long id) { 3 Dao.delete("delete from pricepolicy where id=?", id); 4 return ActionHelper.ajaxOK(); 5 }
復雜代碼的例子,一個事務中多條語句,最有一次提交。如果失敗,會在SpringMVC的異常處理中統一解決,在這里不處理。
1 private void saveSalerToDB(RegistInfo model){ 2 Dao.openTransaction(); 3 //1.insert總公司 4 String sql1 = "insert into org(name, style)values(?, ?)"; 5 long domainId = Dao.insert(sql1, "總公司", OrgConst.domain); 6 Dao.update("update org set domainId=? where id=?", domainId, domainId); 7 //2.insert公司 8 String sql2 = "insert into org(domainId, pid, name, areaId, levelId, style, subStyle)values(?, ?, ?, ?, ?, ?, ?)"; 9 long companyId = Dao.insert(sql2, domainId, domainId, model.getCompanyName(), model.getAreaId(), model.getLevelId(), OrgConst.company, OrgConst.SubStyle_saler); 10 Dao.update("update org set companyId=? where id=?", companyId, companyId); 11 //3.insert崗位: 法人、管理員 12 String sql3 = "insert into org(domainId, companyId, name, style)values(?, ?, ?, ?)"; 13 long positionId = Dao.insert(sql3, domainId, companyId, OrgConst.legalPerson, OrgConst.position); 14 Dao.insert(sql3, domainId, companyId, OrgConst.manager, OrgConst.position); 15 //4.insert員工 16 String sql4 = "insert into staff(companyId, mainPositionId, name, password, username)values(?,?,?,?,?)"; 17 long staffId = Dao.insert(sql4, companyId, positionId, model.getLegalName(), model.getLegalPassword(), model.getLegalUsername()); 18 //5.insert合作關系表,插入兩次,方向不同 19 Org agent = Dao.get(Org.class, "select * from org where id=?", model.getAgentId()); 20 String sql5 = "insert into RelatedUnit(selfId, selfName, partnerId, partnerName, isSupplier, isSaler, isBorrower, isLender, status)values(?,?,?,?,?,?,?,?,?)"; 21 Dao.insert(sql5, companyId, model.getCompanyName(), agent.getId(), agent.getName(), 1, 0, 1, 1, RelatedUnitStatus.NORMAL); 22 Dao.insert(sql5, agent.getId(), agent.getName(), companyId, model.getCompanyName(), 0, 1, 1, 1, RelatedUnitStatus.NORMAL); 23 Dao.commitTransaction(); 24 }
是不是寫代碼更直接更舒服啊。不管你們信不信,反正我信了......
(5)對於數據庫的測試數據,我使用excel管理。excel的每個sheet就是一個表,每一列就是一個字段,把初始化數據和測試數據都放到excel中,只需要一個操作就可以deleteAndInsert到數據庫中了。既方便平時頻繁的增刪字段造成測試數據不准確,也方便日后客戶那里批量導入導出數據的問題。一個字:爽!
(6)使用了log4jdbc,對jdbc做了封裝。jdbc打印的sql都是帶?的,不方便直接復制語句調試,封裝之后,就可以直接打印出執行的語句了
7. select * from Menu where publicRoot=1 and domainRoot=0 order by id
直接拿到數據庫執行就可以了。
使用新的框架做了幾個增刪改查,感覺太好了,最大的優點是開發效率飛速提高,理解問題也簡單了,更關注業務實現,而不是hibernate的語法;另外,維護也方便了,看看jsp、action就完了,不需要service、dao來回翻,並且普通的sql代碼,剛畢業的就可以維護這樣的項目,不需要多少工作經驗。
缺點哪,就是不咋符合java的大型架構思路,沒有純粹的orm,理論家看着不舒服。不過,我不想要哪些華而不實的東西,我要的是完成項目快點,快點,再快點.....早一點完成就可以多接一個單子,時間就是金錢。
項目使用maven構建,代碼比較大,請到QQ群172581012的附件中下載,
聲明:代碼沒完善,100%開發源碼。