公司是金融行业的,项目都是非常庞大,项目的各个层次划分的非常细,一个保存操作,就需要从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%开发源码。