首先,把昨天那俩条sql语句的优化原因给大家补充一下,第一条效率极低,第二条优化后的,sql语句截图如下:

经过几个高手的评论和个人的分析:

第一条sql语句查询很慢是因为它首先使用了in关键字查询,导致全表扫描,其次我那条sql语句的写法上,是通过子查询根据某一个字段去不断匹配后面查询到的集合数据,最后得到查询结果,这一系列操作下来效率上去才怪呢。

但是第二条sql语句是通过连接查询,根据建立了索引的字段来等值匹配,最后得到查询结果,速度杠杠的。(一次小小的优化经历,学到了)。

今天(2017-05-24)在微信公众号上终于等到阿里巴巴集团开源的Java开发手册更新了,从地铁上一路看到公司,真的学到了,人家的开发规约真的是好,讲的很细,很注重细节,这就是差距啊,下面给大家简单总结一下吧(手册原件如果需要,请留言)。

它的名字是《阿里巴巴Java开发手册v1.2.0》,距2017-02-09发布的第一版已经有6个历史了,它的总体结构分为五大部分:编程规约、异常日志、MySQL数据库、工程结构和安全规约。今天我主要给大家分享总结了工程结构,因为我五一前刚给公司开发了一套内网数据录入系统,虽然没用到什么大的框架和潮流的技术,但是麻雀虽小五脏俱全啊。包括表结构、工程搭建和业务梳理都是自己一个人在开发,当时在开发的时候也是感觉很孤独,因为项目组的其他人都有战友配合作战,而我就一个人,还有页面的调试和美化都是我一个人在搞,在此声明一下,我不是在抱怨,反而很珍惜这种开发机会,真的会沉淀很多东西,谢谢公司。

切入正题吧,今天给大家分享的是工程结构这块的一些个人总结。

1、项目应用分层:

这里主要给我们讲述了一下,一个项目理想化的项目架构图,和我们平时开发的项目结构稍稍不同,毕竟人家的架构思维那是相当的高啊,这还是最基础的架构图呢。

上图默认上层依赖于下层,箭头关系表示直接依赖。

开放接口层:可直接封装service层接口中的方法暴露成RPC接口/服务,通过web封装成http接口,最后进行网管控制、流量控制等。

终端显示层:各个端的模板渲染并执行显示的层。当前我们主要接触的是js渲染、jsp渲染和移动端渲染等。

web层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。

service层:相对具体的业务逻辑服务层。

manager层:通用业务处理层,它有如下特征:1、对第三方平台封装的层,预处理返回结果及转化异常信息;2、对service层通用能力的下沉,比如缓存方案、中间件通用处理、3、与dao层交互,对多个dao的组合复用。

dao层:数据访问层,与底层MySQL、Oracle、hbase数据库进行数据交互。

外部接口或第三方平台:包括其他部门的rpc接口,基础平台,其他公司的http接口。

以上都是阿里项目的工程架构,有一点不同的是我们平时通用的是controller层、service服务层和dao数据访问层,但是他们这里提出了manager层,将一些业务通用的处理方式和需要多个dao组合复用的结果抽取到该层,个人感觉在项目维护上很方便,以前我们都是按模块划分,将各个模块的业务逻辑都往service层堆上去,这样其实也没什么不好,但是我们感觉试着将业务层通用的业务抽取一下,刚才还琢磨着把我前俩天写的项目重构一下,最后还是等到端午吧,也好好模仿一把阿里,哈哈哈。

2、项目异常分层处理规约:

因为dao数据访问层产生的异常很多,类型也很多,无法用细粒度的异常进行处理,所以直接将异常丢给service层,为啥要将数据访问层的异常丢到manager/service层,因为通常在manager/service层中会有日志打印,不管是发生异常还是异常抛出,都会时刻记录运行情况到日志文件中去,要是刚才在dao层也将异常打印,又因为dao和service是同台服务器,这样就相当于打印了2次日志,浪费性能和储存。

service产生的异常必须记录到磁盘日志文件中去,尽可能带上参数信息,相当于保护案发现场。

web层大哥们,不能在爽啦,必须处理了,如果产生的异常会导致页面的正常渲染,则采用拦截器或异常处理的方式,跳转到异常错误友好页面,加上友好的错误提示信息,最后还要在开发接口层将产生的异常处理成错误码和错误信息返回。

3、分层领域模型规约:

我们以前的项目中我见过有3类模型类,第一类是web层与视图层传递参数的query类,第二类是与数据表对应的pojo类,第三类是为了响应数据定义的扩展vo类。

下面我们来看看阿里是如何将模型进行规约的,我感觉非常啰嗦但是非常好,其实很多电商公司也估计是这么做的,我之前接触的一个电商项目大概就是这种设计,好长时间了记不清了:

DO(data object):与数据库中的数据表一一对应,通常是应用于数据访问层dao中用于向上传输数据源对象。

DTO(data transfer object):数据传输对象,该模型类主要是应用于service层和manager层,将service层和manager层业务处理后进行向外传输对象。

BO(business object):业务对象,主要是service层输出的封装的业务逻辑的对象。

Query:数据查询对象,各层接受上层传递过来的多个参数并将这些参数封装到query对象中。

VO(view object):视图层对象,主要是web层向视图层传输的数据对象。

4、二方库依赖:

定义GAV遵从一下规则:

(1)、GroupID格式:com.{公司/BU}.业务线.[子业务线],最多四级。

(2)、ArtifactID格式:产品线名-模块名。注意:语意不重复不遗漏,最好到中央仓库中去查证一下。

(3)、Version格式:版本号根据自己公司的规定。

最后给大家送上几条建议,也是在手册中看到的,只不过写到这儿印象比较深刻,还没忘就给大家写在这儿吧:

一:数据订正时,在调用修改和删除方法之前,最好先查询要修改或删除的记录是否存在,确认无误后再进行更新。

二:在查询数据时能避免使用IN关键字就避免,是在避免不了,则需要仔细评估IN后边的数据集合中总数是否超过1000,最好控制在1000以内,我上次的优化经历起源于它,就是匹配的集合数据远远超过1000条,最后导致查询效率极低。

三:sql.xml文件中配置参数尽量使用#{},尽量不要使用${},容易造成sql注入问题。

四:接口过时必须加@Deprecated注释,并且添加注释清晰地说明替代旧接口的新接口或服务。

五:一般不要在pojo类中定义属性的变量时,建议不要加is前缀,但是在数据表中定义属性对应的字段是尽量加上is_前缀,原因是:如果在给属性的变量名加上is前缀极可能会发生,部分框架解析时会引起序列化错误。

六:在定义项目中的包结构时,统一使用小写并单数形式。

七:service层和mapper接口中定义的方法,建议不要写修饰符,目的就是代码结构看着简单,阿里给出的解释,所以我就把我以前的都删掉了,好习惯就应该从现在开始。

八:如果项目中要实现分页逻辑,如果在判断总记录数为0时,则直接返回,避免执行后面的分页语句,给大家送张截图,是我前几天自己写的分页逻辑:

   @Override
     public List<Task> findOrdersByUserId(Task task,Page page) {
         int count = vinTaskMapper.countOrdersByUserId(task);
         page.setMaxRow(count);
         if(count == 0){
             return new ArrayList<Task>();
         }
         return vinTaskMapper.findOrdersByUserId(task,page);
     }

九:禁止使用存储过程,因为难以调试和扩展,更没有移植性。

好了,就总结到这儿吧,这里虽然没什么干货和技术要点,但是我的目的是给大家分享一点编程习惯,具备好的代码风格是作为一个优秀程序员的基本素能,最后希望大家写出来的代码能够越看越美,越看越想看,哈哈哈。

读阿里巴巴Java开发手册v1.2.0之工程结构有感【架构篇】的更多相关文章

  1. 读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

     不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...

  2. 《阿里巴巴Java开发手册v1.2》解析(编程规约篇)

    之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄.如今来了新美大,好好研读一下<阿里巴巴Java开发手册v1.2>.还要对这么看似简单的东西解析一番.毕竟现在带团队, ...

  3. 阿里官方Java代码规范标准《阿里巴巴Java开发手册 终极版 v1.3.0》

    终极版 v1.3.0 2017年开春之际,阿里诚意献上重磅大礼:<阿里巴巴Java开发手册>,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平, ...

  4. 《阿里巴巴Java开发手册(正式版》读记

    前几天,阿里巴巴发布了<阿里巴巴Java开发手册(正式版>,第一时间下载阅读了一番. 不同于一般大厂内部的代码规范,阿里巴巴的这本Java开发手册,可谓包罗万象,几乎日常Java开发中方方 ...

  5. 阿里巴巴Java开发手册快速学习

    Java作为一门名副其实的工业级语言,语法友好,学习简单,大规模的应用给代码质量的管控带来了困难,特别是团队开发中,开发过程中的规范会直接影响最终项目的稳定性. 善医者“未有形而除之”,提高工程健壮性 ...

  6. 阿里巴巴Java开发手册评述

    2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...

  7. 阿里巴巴Java开发手册评

    2016年底的时候阿里巴巴公开了其在内部使用的Java编程规范.随后进行了几次版本修订,目前的版本为v1.0.2版.下载地址可以在其官方社区-云栖社区https://yq.aliyun.com/art ...

  8. 阿里巴巴Java开发手册———个人追加的见解和补充(一)

    先上干货,<阿里巴巴Java开发手册>的下载地址 https://yq.aliyun.com/articles/69327?spm=5176.100239.blogcont69327.15 ...

  9. 读书笔记 之 《阿里巴巴Java开发手册》

    一.前言 这本书主要定义了一些代码的规范以及一些注意事项.我只根据我自己的不足,摘录了一些内容,方便以后查阅. 二.读书笔记 命名 1.代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符 ...

随机推荐

  1. oc 中组合排序算法

    - (NSMutableArray *)zuHeSuanFa:(NSMutableArray *)array chooseCount:(int)m { int n = (int)[array coun ...

  2. C#通过WatiN操作页面中内嵌的Iframe

    通过WatiN.Core.Broswer.Frame()方法来获取iframe对象,之后的容器就是frame,然后进行操作. 下面的例子是登录QQ空间的: Frame frame = browser. ...

  3. .net学习笔记--文件读写的几种方式

    在.net中有很多有用的类库来读写硬盘上的文件 一般比较常用的有: File:1.什么时候使用:当读写件大小不大,同时可以一次性进行读写操作的时候使用         2.不同的方式可以读写文件类型不 ...

  4. 046医疗项目-模块四:采购单模块—采购单审核(Dao,Service,Action三层)

    当医院把采购单提交之后,由监管单位进行采购单审核,由卫生院及卫生局进行审核.卫生局可以审核所有医院创建的采购单,卫生院只审核本辖区医院创建的采购单. 操作流程: 点击"采购单审核" ...

  5. BroadcoastReceiver之短信到来监听和获取内容

    废话就不说了,新建类继承,然后配置Manifest.xml:如下 <!--需要给一个接收短信的权限 --> <uses-permission android:name="a ...

  6. 延时程序执行Qt

    有时候为了让程序暂停一下,不让它一直跑下去,可以使它进入循环结构中! 例如: #include <QCoreApplication> #include <qdebug.h> # ...

  7. chrome 26.0.XXX版本下media query流媒体查询有问题的bug

    这段代码什么意思: @media only screen and (max-width: 1360px)  当用户的界面小于等于1360px的时候, 会加载该流媒体样式(此时的界面是包含滚动条的): ...

  8. php中pdo例子

    下面是从其他博客看到的代码 <?php $dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', ''); $db ...

  9. Java入门教程总目录

    Java入门教程总目录 持续更新中... 1.Java常识汇总 2.Java框架对比 3.Java技术路线 4.Java编码规范 5.Java环境变量配置 6.枚举 7.操作符 12.定时任务

  10. Solr官方文档翻译-About &amp; Getting Started

    关于(About) 官方文档介绍了所有的Apache Solr实现的重要特性和功能.它是免费的,可以到http://lucene.apache.org/solr/下载. 为了更加的深入和广泛,设计成一 ...