带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(5)

简介: 带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(5)

带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(4)https://developer.aliyun.com/article/1339986?groupCode=taobaotech


SQL规约

 

  1. 不要使用count(列名)或count(常量)来替代count(*),count(*)就是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关。说明:count(*)会统计值为NULL的行,而count(列名)不会统计此列为NULL值的行。

 

 

 

  1. count(distinct col) 计算该列除NULL之外的不重复数量。注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0。
  2. 当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,因此使用sum()时  需注意NPE问题。正例:可以使用如下方式来避免sum的NPE问题:SELECT IFNULL(SUM(column), 0) FROM table;
  3. 对于数据库中表记录的查询和变更,只要涉及多个表,都需要在列名前加表的别名(或表名)进行限定。说   明:对多表进行查询记录、更新记录、删除记录时,如果对操作列没有限定表的别名(或表名),并且操作列   在多个表中存在时,就会抛异常。正例:select t1.name from table_first as t1 , table_second as t2 where t1.id=t2.id;反例:在飞猪某业务中,由于多表关联查询语句没有加表的别名(或表名)的限制,正常运行两年 后,最近在某个表中增加一个同名字段,在预发布环境做数据库变更后,线上查询语句出现出1052异常: Column 'name' in field list is ambiguous,导致票务交易下跌。
  4. 在代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句。
  5. 不得使用外键与级联,一切外键概念必须在应用层解决。说明:(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,则为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
  6. 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
  7. IDB数据订正(特别是删除或修改记录操作)时,要先select,避免出现误删除,确认无误才能提交执行。
  8. SQL语句中表的别名前加as,并且以t1、t2、t3、...的顺序依次命名。说明:1)别名可以是表的简称,或者依   据表在SQL语句中出现的顺序,以t1、t2、t3的方式命名。2)别名前加as使别名更容易识别。正例:select t1.name from table_first as t1, table_second as t2 where t1.id=t2.id;
  9. in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在1000个之内。
  10. 因国际化需要,所有的字符存储与表示,均采用utf8字符集,那么字符计数方法注意:说明:SELECT LENGTH("阿里巴巴");返回为12SELECT   CHARACTER_LENGTH("阿里巴巴");返回为4如果需要存储表 情,那么选择utf8mb4来进行存储,注意它与utf8编码的区别。

 

ORM规约

 

  1. 在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。说明:1)增加查询分析器解析成本。2)增减字段容易与resultMap配置不一致。3)多余字段增加网络消耗,尤其是 text 类型的字段。
  2. POJO类的布尔属性不能加is,而数据库字段必须加is_,要求在resultMap中进行字段与属性之间的映射。说明:参见定义POJO类以及数据库字段定义规定,在sql.xml增加映射,是必须的。
  3. 不要用resultClass当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义;反过来,每一个表也    必然有一个与之对应。说明:配置映射关系,使字段与DO类解耦,方便维护。

 

 

 

  1. sql.xml配置中参数注意:#{},#param# 不要使用${} 此种方式容易出现SQL注入。
  2. iBATIS自带的queryForList(String statementName,int start,int size)不推荐使用。说明:其实现方式是在数据库取到statementName应的SQL语句的所有记录,再通过subListstart,size的子集合,线上因为这个原 因曾经出现过OOM。正例:在sqlmap.xml中引入 #start#, #size#
  Map<String, Object> map = new HashMap<>(16);
  map.put("start", start);
  map.put("size", size);
  1. 不允许直接拿HashMap与HashTable作为查询结果集的输出。反例:某同学为避免写一个xxx,直接使用HashTable来接收数据库返回结果,结果出现日常是把bigint转成Long值,而线上由于数据库版本不一样,解析成BigInteger,导致线上问题。
  2. 更新数据表记录时,必须同时更新记录对应的gmt_modified字段值为当前时间。

 

带你读《2022技术人的百宝黑皮书》——开发规约的意义与细则(6)https://developer.aliyun.com/article/1339984?groupCode=taobaotech

相关文章
|
Web App开发 编解码 网络协议
LVS峰会 | 阿里云李刚:下一代低延时的直播CDN
在上周落幕帷幕的多媒体领域技术盛会——LiveVideoStackCon音视频技术大会上,阿里云的高级技术专家李刚进行了《下一代低延时的直播CDN》技术分享。主讲人李刚,多年关注在CDN这个领域,早期主要研究和cache服务器缓存以及流媒体相关的技术, 专注CDN文件分发、图片与大文件下载等业务。
5776 0
|
12月前
|
存储 缓存 Linux
docker底层实现
docker底层实现
179 0
|
消息中间件 编解码 网络协议
聊聊 RocketMQ 网络通讯模块
RocketMQ 的网络通讯模块负责生产者、消费者与 Broker 之间的网络通信。 笔者学习 RocketMQ 也是从通讯模块源码开始的,并且从源码里汲取了很多营养。
聊聊 RocketMQ 网络通讯模块
【YashanDB知识库】ycm托管主机报错libnsl.so.1 no such file or directory
【YashanDB知识库】ycm托管主机报错libnsl.so.1 no such file or directory
IDEA 中 project窗口,不显示项目工程目录,解决方法
IDEA 中 project窗口,不显示项目工程目录,解决方法
|
前端开发 JavaScript Java
idea中如何不重启tomcat 即可看到修改内容变化
这篇文章介绍了在IntelliJ IDEA中实现对Java Web应用的热部署(Hot Swap)的多种方法,包括启用自动构建、使用Exploded Artifact、安装JRebel插件、更改静态资源、使用Spring Boot的devtools以及IDEA的HotSwap功能,以便在不重启Tomcat服务器的情况下看到修改内容的变化。
idea中如何不重启tomcat 即可看到修改内容变化
|
自然语言处理 安全 Java
Spring Boot中集成Lucence
本节课首先详细的分析了全文检索的理论规则,然后结合 Lucene,系统的讲述了在 Spring Boot 的集成步骤,首先快速带领大家从直观上感受 Lucene 如何建立索引已经如果检索,其次通过中文检索的具体实例,展示了 Lucene 在全文检索中的广泛应用。Lucene 不难,主要就是步骤比较多,代码不用死记硬背,拿到项目中根据实际情况做对应的修改即可。
|
Web App开发 关系型数据库 PHP
使用 Docker 快速搭建多版本 PHP 开发环境
使用 Docker 快速搭建多版本 PHP 开发环境
494 2