电信政务大数据编码规范.docx

上传人:田海滨 文档编号:525752 上传时间:2025-07-29 格式:DOCX 页数:24 大小:56.09KB
下载 相关 举报
电信政务大数据编码规范.docx_第1页
第1页 / 共24页
电信政务大数据编码规范.docx_第2页
第2页 / 共24页
电信政务大数据编码规范.docx_第3页
第3页 / 共24页
电信政务大数据编码规范.docx_第4页
第4页 / 共24页
电信政务大数据编码规范.docx_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、电信政务大数据编码规范XX科技股份有限公司编制目录一、编程规约3(一)命名风格3(二)常量定义7(三)代码格式8(四)OOP规约11(五)集合处理17(六)并发处理22(七)控制语句28(八)注释规约32(九)其它34二、异常日志35(一)异常处理35(二)日志规约38三、单元测试40四、安全规约42五、MySQ1.数据库43(一)建表规约43(二)索引规约46(三)SQ1.语句48(四)ORM映射49六、工程结构50(一)应用分层50(二)二方库依赖51(三)服务器53七、设计规约54附1:专有名词解释58一、编程规约(一)命名风格1 .【强制】代码中的命名均不能以下划线或美元符号开始,也不

2、能以下划线或美元符号结束。反例:_name/name/Sname/name_/name$/name2 .【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。说明:正确的英文拼写和语法可以让阅读者易于理解,避免岐义。注意,纯拼音命名方式更要避免采用。正例:renminbi/a1.ibaba/taobao/youku/hangzhou等国际通用的名称,可视同英文。反例:DaZhePromotion打折/geIPingfenByNameO评分/int某变量=3【强制】类名使用UpperCame1.Case风格,但以下情形例外:DO/BO/DTO/VO/A0PO/UID等。上

3、例:JavaServer1.essP1.atform/UserDO/Xm1.Service/TcpUdpDea1./TaPromotion反例:Javaserver1.essp1.atforin/UserDo/XM1.Service/TCP1.DPDea1./TAPromotion4 .【强制】方法名、参数名、成员变量、局部变量都统一使用IowerCanic1.Case风格,必须遵从驼峰形式。王例:Ioca1.Va1.ue/getHttpMessageO/inputUser1.d5 .【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。IE例:MAX_SToCK_

4、COUNT/CACHEEXPIRED_TIME反例:MAXCOUNT/EXPIREDTIME6 .【强制】抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以TeSt结尾。7 .【强制】类型与中括号紧挨相连来表示数组。正例:定义整形数组intarrayDemo;反例:在main参数中,使用StringargS口来定义。8 .【强制】POJO类中布尔类型变量都不要加is前缀,否则部分框架解析会引起序列化错误。说明:在本文MySQ1.规约中的建表约定第一条,表达是与否的值采用is_xxx的命名方式,所以,需要在resu1.tMa

5、p设置从is_xxx到XXX的映射关系。反例:定义为基本数据类型Boo1.eanisDe1.eted的属性,它的方法也是iSDe1.etedO,RPC框架在反向解析的时候,“误以为”对应的属性名称是de1.eted,导致属性获取不到,进而抛出异常。9 .【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。工例:应用工具类包名为com.a1.ibaba.ai.uti1.类名为MessageUtiIs(此规则参考spring的框架结构)10 .【强制】避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完

6、全相同的命名,使可读性降低。说明:子类、父类成员变量名相同,即使是pub1.ic类型的变量也是能够通过编译,而局部变量在同一方法内的不同代码块中同名也是合法的,但是要避免使用。对于非setter/getter的参数名称也要避免与成员变量名称相同。反例:pub1icc1.assConfusingNamepub1.icintage:/非setter/getter的参数名称,不允许与本类成员变量同名pub1.icvoidgetDataStringa1.ibabaifconditionfina1.intmoney=531:/.for(inti0;i10;i+)/在同一方法体中,不允许与其它代码块中的m

7、oney命名相同fina1.intmoney615:/.c1.assSonextendsConfusingName/不允许与父类的成员变量名称相同pub!icintage:11 .【强制】杜绝完全不规范的维写,避免望文不知义。反例:AbStraetC1.ass缩写命名成AbsC1.ass:condition缗写命名成condi,此类随意缩写严重降低了代码的可阅读性。12 .为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。正例:在JDK中,表达原子更新的类名为:AtomicKeferenceFie1.dUpdatero一例:inta的随意命名方式。13 .

8、在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。正例:StartTime/WOrkQUeUe/name1.ist/TERMINATED_TIIREAD_COUNT反例:StartedAt/QueucOWork/IistName/COUNTTERMINATEDTHREAD14 .如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式。说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念IE例:pub1.icc1.assOrderFactory;pub1.icc1.ass1.oginProxy;pub1.icc1.assKesourceObserver;15 .接

9、口类中的方法和属性不要加任何修饰符号(PUbIiC也不要加),保持代码的简洁性,并加上有效的JaVadoC注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础富量。-E例:接口方法签名voidcommit();接口基础常量StringCoMPANY=a1.ibaba;反例:接口方法定义pub1.icabstractvoidfO;说明:JDK8中接口允许有默认实现,那么这个defau1.t方法,是对所有实现类都有价值的默认实现。16 .接口和实现类的命名有两套规则:1)【强制】对于Service和DAo类,基于SOA的理念,暴露出来的服务一定是接口,内部

10、的实现类用ImP1.的后缀与接口区别。正例:CacheServiceimp1.实现CaCheSerViCe接口。2) 如果是形容能力的接口名称,取对应的形容词为接口名(通常是-ab1.e的形容词)。正例:AbStraCtTranSIatOr实现Trans1.atab1.e接口。17 .【叁考】枚举类名带上Enum后缀,枚举成员名称需要全大写,单词问用下划线隔开。说明:枚举其实就是特殊的类,域成员均为常量,且构造方法被.默认强制是私有。正例:枚举名字为ProcessStatusEnum的成员名称:SUCCESS/UNKNOWN.REASoN/18 .【参考】各层命名规约:SerViCe/DAO层

11、方法命名规约1) 获取单个对象的方法用get做前缀。2)获取多个对象的方法用1.ist做前掇,复数形式结尾如:IiStObjects03) 获取统计值的方法用count做前缀。4) 插入的方法用save/insert做前跟。5) 删除的方法用remove/de1.ete做前缀。6) 修改的方法用UPdate做前缀。B)领域模型命名规约1)数据对象:xxxDO,XXX即为数据表名。2)数据传输对象:xxxDTO,XXX为业务领域相关的名称。3)展示对象:XXXVO,XXX一般为网页名称。4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxP0J0o(二)常量定义1 .【强制】不允许任

12、何魔法值(即未经预先定义的常量)直接出现在代码中。反例:Stringkey=Id#taobao_*+tradeId:cache.put(key,va1.ue);/缓存get时,由于在代码复制时,漏掉下划线,导致缓存击穿而出现问题2 .【强制】在1.ong或者1.ong赋值时,数值后使用大写的1.,不能是小写的1,小写容易跟数字1混淆,造成误解。说明:1.onga=21;写的是数字的21,还是1.ong型的2。3 .【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。说明:大而全的常量类,杂乱无章,使用查找功能才能定位到修改的常量,不利于理解和维护。正例:缓存相关常量放在类C

13、acheConsts下:系统配置相关常量放在类ConfigConstsT04 .【推荐】常量的熨用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。1)跨应用共享常量:放置在二方库中,通常是c1.ient,jar中的constant目录下。2)应用内共享常量:放置在一方库中,通常是子模块中的constant目录下。反例:易懂变量也要统一定义成应用内共享常量,两位工程师在两个类中分别定义了“YES”的变量:类A中:pub1.icstaticfina1.StringYES=yes:类B中:pub1.icstaticfina1.StringYES=y;A.YE

14、S.equa1.s(B.YES),预期是true,但实际返回为fa1.se,导致线上问题。3) 子工程内部共享常量:即在当前子工程的constant目录下。4) 包内共享常量:即在当前包下单独的ConS1.ant目录下。5) 类内共享常量:直接在类内部privatestaticfina1.定义。6) 【推荐】如果变量值仅在一个固定范围内变化用enum类型来定义。说明:如果存在名称之外的延伸属性应使用enum类型,下面正例中的数字就是延伸信息,表示一年中的第几个季节。正例:pub1.icenumSeasonEnuniSPRING(I),SUMMER(2),AUTUMN(3),WINTER(4);

15、privateintseq;SeasonEnum(intseq)this.Seq=seq;Ipuh1.icintgetSeq()(returnseq;)(三)代码格式1.【强制】如果是大括号内为空,则简洁地写成即可,大括号中间无需换行和空格;如果是非空代码块则:1)左大括号前不换行。2)左大括号后换行。3)右大括号前换行。4)右大括号后还有e1.se等代码则不换行:表示终止的右大括号后必须换行。2 .【强制】左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格;而左大括号前需要空格。详见第5条下方正例提示。反例:if(空格a=b空格)3 .【强制】if/for/whi1.e/sw

16、itch/do等保留字与括号之间都必须加空格。4 .【强制】任何二目、三目运算符的左右两边都需要加一个空格。说吃:运算符包括赋值运算符=、逻辑运算符&、加渡乘除符号等。5 .【强制】在日志输出时,字符串变量之间的拼接使用占位符的方式。说明:因为String字符串的拼接会使用StringBui1.der的append。方式,有一定的性能损耗。使用占位符仅是替换动作,可以有效提升性能。正例:1.ogger.Processingradewitid:andsymbo1.:,.id.symbo1.;6 .【强制】对于trace/debug/info级别的日志输出,必须进行日志级别的开关判断。说明:虽然在

17、debug(参数)的方法体内第一行代码isDisab1.ed(1.eve1.DEBUGNT)为真时(S1.f4j的常见实现1.og4j和1.ogback),就直接return,但是参数可能会进行字符串拼接运算。此外,如果debug(getName()这种参数内有getName()方法调用,无谓浪费方法调用的开销。正例:/如果判断为真,那么可以抢出IraCe和debug级别的日志if1.ogger.IsDebugEnab1.edO)1.ogger,debug(CurrentIDis:andnameis:(,id,getXame();7 .【强制】避免重复打印日志,浪费磁盘空间,务必在1.og4j

18、xm1.中设置additivity=fa1.se工例:8 .【强制】异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。壬例:IOgger.error(各类参数或者对象toString()+e.getMessageO,);9 .谨慎地记录日志。生产环境禁止输出debug日志;有选择地输出info日志;如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器横盘撑爆,并记得及时删除这些观察日志。说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志

19、你能做什么?能不能给问题排查带来好处?10 可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投6 .【强制】核心业务、核心应用、核心模块的增量代码确保单元测试通过。说明:新增代码及时补充单元测试,如果新增代码影响了原有单元测试,请及时修正。7 .【强制】单元测试代码必须写在如下工程目录:src/test/java,不允许写在业务代码目录下。说明:源码编译时会跳过此目录,而单元测试框架默认是扫描此目录。8 .单元测试的基本目标:语句覆盖率达到70%;核心模块的语句覆盖率和分支覆盖率都要达到100%说明:在工程规约的应用分层中提到的DAO层,Manager层,可重用度高的Servic

20、e,都应该进行单元测试。9 .1编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量。 B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。 C:Correct,正确的输入,并得到预期的结果。 I):Design,与设计文档相结合,来编写单元测试。 E:Error,强制错误信息输入(如:非法数据、异常流程、业务允许外等),并得到预期的结果。10 .【】对于数据库相关的查询,更新,弱除等操作,不能假设数据库里的数据是存在的,或者直接操作数据库把数据插入进去,请使用程序插入或者导入数据的方式来准备数据。反例:删除某一行数据的单元测试,在数据库中,先直接手动增加一行

21、作为删除目标,但是这一行新增数据并不符合业务插入规则,导致测试结果异常。11 .【】和数据库相关的单元测试,可以设定自动回滚机制,不给数据库造成脏数据。或者对单元测试产生的数据有明确的前后缀标识。正例:在企业智能事业部的内部单元测试中,使用ENTERPRISE_INTE1.1.IGENCE_07工侬匚的前缓来标识单元测试相关代码。12 .对于不可测的代码在适当的时机做必要的重构,使代码变得可测,避免为了达到测试要求而书写不规范测试代码。防止SQ1.注入,禁止字符串拼接SQ1.访问数据库。13 【强制】用户请求传入的任何参数必须做有效性验证。说明:忽略参数校骁可能导致:pagesize过大导致内

22、存溢出恶意Orderby导致数据库慢查询任意重定向SQ1.注入反序列化注入正则输入源串拒绝服务ReDoS说明:Java代码用正则来脸证客户端的揄入,有些正则写法验证普通用户输入没有问题,但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。14 【强制】禁止向HTM1.页面输出未经安全过渡或未正确转义的用户数据。15 【强制】表单、AJAX提交必须执行CSRE安全验证。说明:CSRF(Cross-siterequestforgery)跨站请求伪造是一类常见编程漏洞。对于存在CSRF漏洞的应用/网站,攻击者可以事先构造好UR1.,只要受害者用户一访问,后台便在用户不知情的情况下

23、对数据库中用户参数进行相应修改。16 【强制】在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放的机制,如数量限制、疲劳度控制、验证码校验,避免被滥刷而导致资损。说明:如注册时发送骁证码到手机,如果没有限制次数和频率,那么可以利用此功能骚扰到其它用户,并造成短信平台资源浪费。17 【:发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过滤等风控策略。五、MySQ1.数据库(一)建表规约1 .【强制】表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsignedtinyint(1表示是,0表示否)。说叼:任何字段如果为非负数,必须是un

24、signed.注意:POJO类中的任何布尔类型的变量,都不要加is前缀,所以,需要在设置从is_xxx到Xxx的映射关系。数据库表示是与否的值,使用tinyint类型,坚持is_xxx的命名方式是为了明确其取值含义与取值范围。王例:表达逻辑删除的字段名is_de1.eted,1表示删除,0表示未删除。2 .【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称霜要慎重考虑。说明:MySQ1.在Windows下不区分大小写,但在1.inUX下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出

25、现任何大写字母,避免节外生枝。正例:a1.iyunadmin,rdcconfig,Ieve13nameV,例:A1.iyunAdmin,rdcConfig,1.eve1._3_name3 .【强制】表名不使用复数名词。说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于Do类名也是单数形式,符合表达习惯。4 .【强制】禁用保留字,如desc、range、match、de1.ayed等,请参考MySQ1.官方保留字。5 .【强制】主键索引名为pk字段名;唯一索引名为Uk字段名;普通索引名则为idx_字段名。说明:pk_即primarykey;uk_即uniquekey;idx_即i

26、ndex的简称。6 .【强制】小数类型为decima1.,禁止使用f1.oat和doub1.e,说明:在存储的时候,f1.oat和doub1.e都存在精度损失的问题,很可能在比较值的时候,得到不正确的结果。如果存储的数据范围超过decima1.的范围,建议将数据拆成整数和小数并分开存储。7 .【强制】如果存储的字符串长度几乎相等,使用char定长字符串类型。8 .【强制】varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。9 .【强制】表必备三字段:id,create_ti

27、me,UPdate_time。说明:其中id必为主键,类型为bigintunsigned,单表时自增、步长为1。Createupdate,time的类型均为datetime类型。10 .】表的命名最好是遵循“业务名称一表的作用”。正例:a1.ipaytask/forceproject/tradeconfig11 .库名与应用名称尽量一致。12 .如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。13 .【字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:1)不是频繁修改的字段。2)不是VarChar超长字段,更不能是text字段。3)不是唯一索引的字段。正例:

28、商品类目名称使用频率高,字段长度短,名称基本一不变,可在相关联的表中冗余存储类目名称,避免关联查询。14 .【单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表。说明:如果颈计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。15 .【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。正例:如下表,其中无符号值可以避免误存负数,且扩大了表示范围。对象年龄区类型字节表示范围人150岁tinyint1无符号值:0到龟数百岁sma1.Iint2无符号值:0到恐龙数千万int4无符号值:0到约太阳约50bigint8无符号值:0到约(二)索

29、引规约1 .【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。说明:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。2 .【强制】超过三个表禁止join。需要join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。说明:即使双表join也要注意表索引、SQ1.性能。3 .【强制】在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。说明:索引的长度与区分度是

30、一对矛盾体,一般对字符串类型数据,长度为20的索引,区分度会高达90%以上,可以使用count(distinctIeft(列名,索引长度)count(*)的区分度来确定。4 .【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。说明:索引文件具有B-Tree的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。5 .如果有Orderby的场景,请注意利用索引的有序性。Orderby最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现fi1.e-Sort的情况,影响查询性能。J例:Wherea=?andb=?orderbyc;索引:a_b_c反例:索引如果存在范

31、围查询,那么索引有序性无法利用,如:WHEREa100RDERBYb;索引ab无法排序。6 .】利用覆盖索引来进行查询操作,避免回表。说明:如果一本书需要知道第11章是什么标题,会翻开第11章对应的那一页吗?目录浏览一下就好,这个目录就是起到覆盖索引的作用。正例:能够建立索引的种类分为主键索引、唯一索引、普通索引三种,而覆盖索引只是一种查询的一种效果,用exp1.ain的结果,extra列会出现:usingindexo7 .1.利用延迟关联或者子查询优化超多分页场景。说明:MySQ1.并不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回N行,那当OffSet特

32、别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQ1.改写。正例:先快速定位需要获取的id段,然后再关联:SE1.ECTa.*I-ROM表1a,(se1.ectidfrom表1where条件1.1.MIT100000,20)bwherea.id=b.id8 .SQ1.性能优化的目标:至少要达到range级别,要求是ref级别,如果可以是COnStS最好。说明:1) consts单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。2) ref指的是使用普通的索引(norma1.index)o3)range对索引进行范围检索。反例:exp1.a

33、in表的结果,type=index,索引物理文件全扫描,速度非常慢,这个index级别比较range还低,与全表扫描是小巫见大巫。9 .!:建组合索引的时候,区分度最高的在最左边。ZE例:如果wherea=?andb=?,如果a列的几乎接近于唯一值,那么只需要单建idx_a索引即可。说明:存在非等号和等号混合时,在建索引时,请把等号条件的列前置。如:wherec?andd=?那么即使C的区分度更高,也必须把c1.放在索引的最前列,即索引idx_d_co10 .防止因字段类型不同造成的隐式转换,导致索引失效。11 .【参考】创建索引时避免有如下极端误解:1)宁滥勿缺。认为一个查询就需要建一个索引

34、2)宁缺勿滥。认为索引会消耗空间、严重拖慢记录的更新以及行的新增速度。3)抵制惟一索引。认为业务的惟一性一律需要在应用层通过“先查后插”方式解决。(三)SQ1.语句1 .【强制】不要使用COUnt(列名)或CoUnt(常量)来替代count(*),COUnt(*)是SQ1.92定义的标准统计行数的语法,跟数据库无关,眼NU1.1.和非NU1.1.无关。说明:CoUnt(*)会统计值为NU1.1.的行,而COUnt(列名)不会统计此列为NU1.1.值的行。2 .【强制】CoUnt(distinctco1.)计算该列除NU1.1.之外的不重复行数,注意count(distinctco1.1.,c

35、o12)如果其中一列全为NU1.1.,那么即使另一列有不同的值,也返回为Oo3 .【强制】当某一列的值全是NU1.1.时,CoUnt(COD的返回结果为0,但sum(co1.)的返回结果为NU1.1.,因此使用SUmo时需注意NPE问题。正例:使用如下方式来避免sum的NPE问题:SE1.ECTIFNU1.1.(SUM(co1.umn),0)FROMtab1.e;4 .【强制】使用ISNU1.1.o来判断是否为NU1.1.值。说明:NU1.1.与任何值的直接比较都为NU1.1.oDNu1.1.onu1.1.的返回结果是nu1.1.,而不是fa1.se。2) NU1.1.=NU1.1.的返回结果

36、是NU1.1.,而不是true。3) NU1.1.O1.的返回结果是NU1.1.,而不是Iruee5 .【强制】代码中写分页查询逻辑时,若count为O应直接返回,避免执行后面的分页语句。6 .【强制】不得使用外键与级联,一切外键概念必须在应用层解决。说明:以学生和成绩的关系为例,学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的Studenjid,同时触发成绩表中的StudentJd更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。7 .【强制】

37、禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。8 .【强制】数据订正(特别是删除、修改记录操作)时,要先se1.ect,避免出现误删除,确认无误才能执行更新语句。9 .in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在100O个之内。10 .【参考】如果有国际化需要,所有的字符存储与表示,均以utf-8编码,注意字符统计函数的区别。说明:SE1.ECT1.ENGTH(轻松工作”);返回为12SE1.ECTaIARACTER.1.ENGTH(轻松工作”);返回为4如果需要存储表情,那么选择utf8mb4来进行存储,注意它与utf-8编码的区别。11 .(亨

38、TRUNCATETB1.E比DE1.ETE速度快,且使用的系统和事务日志资源少,但TRUNCATE无事务且不触发trigger,有可能造成事故,故不建议在开发代码中使用此语句。说用:TRUNCATETAB1.E在功能上与不带WHERE子句的DE1.ETE语句相同。(四)ORM映射1 .【强制】在表查询中,一律不要使用*作为查询的字段列表,需要哪些字段必须明确写明。说明:1)增加查询分析器解析成本。2)增减字段容易与resu1.tMap配置不一致。3)无用字段增加网络消耗,尤其是text类型的字段。2 .【强制】POJO类的布尔属性不能加is,而数据库字段必须加is_,要求在resu1.tMa

39、p中进行字段与属性之间的映射。说明:参见定义POJO类以及数据库字段定义规定,在resuhMap中增加映射,是必须的。在MyBa1.iSGenerator生成的代码中,需要进行对应的修改。3 .【强制】不要用resu1.tc1.ass当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义;反过来,每一个表也必然有一个POJO类与之对应。说明:配置映射关系,使字段与DO类解耦,方便维护。4 .【强制】Sq1.Xm1.配置参数使用:#,Sparamtf不要使用S此种方式容易出现SQ1.注入。【强制】iBATIS自带的queryFor1.ist(StringStatementName,ints

40、tart,iniSiZe)不推荐使用。说叫:其实现方式是在数据库取到StatementName对应的SQ1.语句的所有记录,再通过sub1.ist取start,size的子集合。正例:Mapmap=newHashMapOO;map.put(wstart,start);map.put(size,size);6 .【强制】不允许直接拿HashMap与Hashtab1.e作为查询结果集的输出。说明:resu1.tc1.ass=Hashtab1.e”,会置入字段名和属性值,但是值的类型不可控。7 .【强制】更新数据表记录时,必须同时更新记录对应的gmt_modified字段值为当前时间。8 .【不要写

41、一个大而全的数据更新接口。传入为POJO类,不管是不是自己的目标更新字段,都进行updatetab1.esetc1.=va1.ue1.,c2=va1.ue2,c3=va1.ue3;这是不对的。执行SQ1.时,不要更新无改动的字段,一是易出错;二是效率低;三是增加bin1.og存储。9 .QTransactiona1.事务不要溢用。事务会影响数据库的QPS,另外使用事务的地方需要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。10 .【甘考】isEqua1.中的CompareVa1.ue是与属性值对比的常量,一般是数字,表示相等时带上此条件;isNotEmpty表示不为空

42、且不为nu1.1.时执行;isNotNu1.1.表示不为nu1.1.值时执行。六、工程结构(一)应用分层1 .I图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于WCb层,也可以直接依赖于Service层,依此类推:t据持久区(I)AOK1.开放接口层:可直接封装Service方法暴露成RPC接口;通过Web封装成http接口:进行网关安全控制、流量控制等。终端显示层:各个端的模板渲染并执行显示的层。当前主要是ve1.ocity渲染,JS演染,JSP渲染,移动端展示等。Wcb层:主要是对访问控制进行转发,各类基本参数校跄,或者不复用的业务简单处理等。Service层:相对

43、具体的业务逻辑服务层。Manager层:通用业务处理层,它有如下特征:1)对第三方平台封装的层,预处理返回结果及转化异常信息。2 )对SerViCe层通用能力的下沉,如缓存方案、中间件通用处理。3 )与DAO层交互,对多个D0的组合复用。DAO层:数据访问层,与底层MySQ1.,Orac1.e,Hbase等进行数据交互。外部接口或第三方平台:包括其它部门RPC开放接口,基础平台,其它公司的HTTP接H。4 .【参考】(分层异常处理规约)在DAO层,产生的异常类型有很多,无法用细粒度的异常进行catch,使用catch(Exceptione)方式,并thrownewDAOException(e)

44、不需要打印日志,因为日志在ManagerZService层一定需要捕获并打印到日志文件中去,如果同台服务器再打日志,浪费性能和存储。在Service层出现异常时,必须记录出错日志到磁盘,尽可能带上参数信息,相当于保护案发现场。如果Manager层与Service同机部署,日志方式与DAO层处理一致,如果是单独部署,则采用与Service一致的处理方式。Web层绝不应该继续往上抛异常,因为已经处于顶层,如果意识到这个异常将导致页面无法正常渲染,那么就应该直接跳转到友好错误页面,加上用户容易理解的错误提示信息。开放接口层要将异常处理成错误码和错误信息方式返回。5 .【参考】分层领域模型规约:DO

45、DataObject):此对象与数据库表结构对应,通过DAO层向上传输数据源对象。DTO(DataTransferObject):数据传输对象,Service或Manager向外传输的对象。BO(BusinessObject):业务对象,由Service层输出的封装业务逻辑的对象。AO(App1.icationObject):应用对象,在Web层与SerViCe层之间抽象的复用对象模型,极为贴近展示层,复用度不高。VO(ViewObject):显示层对象,通常是Web向模板渲染引擎层传输的对象。Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传

46、输。(二)二方库依赖1 .【强制】定义GAV遵从以下规则:1) GroupID格式:Com.公司/BU.业务线.子业务线,最多4级。说明:公司BU例如:a1.ibaba/taobao/tma1.1/a1.iexpress等BU一级;子业务线可选。IF例:com.taobao.jstorm或com.a1.ibaba,dubbo.register2) ArtifaCt1.D格式:产品线名-模块名。语义不重里不遗漏,先到中央仓库去查证一下。正例:dubbo-c1.ient/fastjson-api/jstor11-too1.3) Version:详细规定参考下方。2 .【强制】二方库版本号命名方式:主版本号.次版本号.修订号1)主版本号:产品方向改变,或者大规模API不兼容,或者架构不兼容升级。2)次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的AP1.不兼容修改。3)修订号:保持完全兼容性,修复BUG、新增次要功能特性等。说明:注意起始版本号必须为:1.0.0,而不是0.0.1,正

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 通信/电子 > 数据通信与网络

宁ICP备18001539号-1