zoukankan      html  css  js  c++  java
  • 快速开发框架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%开发源码。

  • 相关阅读:
    vs2017启动iis局域网无法访问解决
    centos7多节点部署redis4.0.11集群
    centos7用docker安装elasticsearch5.6.13的主从
    centos7用docker安装单节点redis4.0.11
    centos7用docker安装mysql5.7.24后配置主从
    centos7 docker 安装 mysql5.7.24 导入12G的sql
    局域网内搭建一个服务器,可以使用 https 吗
    nginx负载均衡fair模块安装和配置
    腿伤中,继续养...
    文件Move操作
  • 原文地址:https://www.cnblogs.com/meiyuanbao/p/2634403.html
Copyright © 2011-2022 走看看