快速开发框架V0.001(免费、100%开源)

    公司是金融行业的,项目都是非常庞大,项目的各个层次划分的非常细,一个保存操作,就需要从jsp的form->action的vo->在service层convert成其他系统需要的vo->在dao中映射到xml(使用ibatis)->db。每次映射都要注意字段名称是否一致,否则出错,好累...

    在实际中经常看到接私活的朋友,怀疑人家怎么那么快就可以做出项目,而我不行那,因此苦苦思考一款java领域的快速开发框架,首先想到的是hibernate。

    Eclipse.org

    这是个好东西,自动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%开发源码。

posted @ 2012-08-12 12:50  吴超沉思录  阅读(4870)  评论(5编辑  收藏  举报