阿里巴巴程序规范

一、编程规约

  1. 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列
    化错误。
    版本号 制定团队 更新日期 备注
    1.7.0 阿里巴巴与全球 Java 社区开发者 2020.08.03 嵩山版,首次发布前后端规约
    Java 开发手册
    2/59
    说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所以,需要
    在设置从 is_xxx 到 xxx 的映射关系。
    反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时
    候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

  2. 【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。 正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal /
    TaPromotion 反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal
    / TAPromotion

自己常见错误

  1. 【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
    反例:
    // 本例中,开发者 A 定义了缓存的 key,然后开发者 B 使用缓存时少了下划线,即 key 是"Id#taobao"+tradeId,导致
    出现故障
    String key = “Id#taobao_” + tradeId;
    cache.put(key, value);

在这里插入图片描述

  1. 【强制】注释的双斜线与注释内容之间有且仅有一个空格。 正例: // 这是示例注释,请注意在双斜线之后有一个空格 String commentString = new String();

  2. 【强制】方法参数在定义和传入时,多个参数逗号后面必须加空格。
    正例:下例中实参的 args1,后边必须要有一个空格。
    method(args1, args2, args3);

还有一个自己比较容易忽略的

11.【强制】定义数据对象 DO 类时,属性类型要与数据库字段类型相匹配。
正例:数据库字段的 bigint 必须与类属性的 Long 类型相对应。
反例:某个案例的数据库表 id 字段定义类型 bigint unsigned,实际类对象属性为 Integer,随着 id 越来
越大,超过 Integer 的表示范围而溢出成为负数

JAVA 实体类的属性类型与数据库表字段类型对应表
添加链接描述

这个倒是没有注意过

18.【强制】禁止在 POJO 类中,同时存在对应属性 xxx 的 isXxx()和 getXxx()方法。
说明:框架在调用属性 xxx 的提取方法时,并不能确定哪个方法一定是被优先调用到的。
19.【推荐】使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内容
的检查,否则会有抛 IndexOutOfBoundsException 的风险。

我去,赶紧避坑—日期时间

大哥总结的太好了!!!
冬天里的懒猫1
冬天里的懒猫2
冬天里的懒猫3
冬天里的懒猫4

1. 【强制】日期格式化时,传入 pattern 中表示年份统一使用小写的 y。
说明:日期格式化时,yyyy 表示当天所在的年,而大写的 YYYY 代表是 week in which year(JDK7 之后
引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的 YYYY
就是下一年。
正例:表示日期和时间的格式如下所示:
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
  1. 【强制】获取当前毫秒数:System.currentTimeMillis(); 而不是 new Date().getTime()。
    说明:如果想获取更加精确的纳秒级时间值,使用 System.nanoTime 的方式。在 JDK8 中,针对统计时间
    等场景,推荐使用 Instant 类。
  2. 【强制】不允许在程序任何地方中使用:1)java.sql.Date。 2)java.sql.Time。 3 )java.sql.Timestamp。 说明:
    第 1 个不记录时间,getHours()抛出异常;
    第 2个不记录日期,getYear()抛出异常;
    第 3 个在构造 方法 super((time/1000)*1000),在 Timestamp属性 fastTime 和 nanos 分别存储秒和纳秒信息。 反例:
    java.util.Date.after(Date)进行时间比较时,当入参是 java.sql.Timestamp 时,会触发 JDK BUG(JDK9 已修复),可能导致比较时的意外结果。
  3. 【强制】SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static,
    必须加锁,或者使用 DateUtils 工具类。
    正例:注意线程安全,使用 DateUtils。亦推荐如下处理:
    private static final ThreadLocal df = new ThreadLocal() {
    @Override
    protected DateFormat initialValue() {
    return new SimpleDateFormat(“yyyy-MM-dd”);
    }
    };
    Java 开发手册
    18/59
    说明:如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar,
    DateTimeFormatter 代替 SimpleDateFormat,官方给出的解释:simple beautiful strong immutable
    thread-safe。

控制语句-自己经常忽略的点

  1. 【强制】在一个 switch 块内,每个 case 要么通过 continue/break/return 等来终止,要么 注释说明程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个 default Java 开发手册 21/59
    语句并且放在最后,即使它什么代码也没有。 说明:注意 break 是退出 switch 语句块,而 return 是退出方法体。

二、异常日志

最常见空指针异常

11.【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景:
1) 返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
反例:public int f() { return Integer 对象}, 如果为 null,自动解箱抛 NPE。
2) 数据库的查询结果可能为 null。
3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
4) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。
5) 对于 Session 中获取的数据,建议进行 NPE 检查,避免空指针。
6) 级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。
正例:使用 JDK8 的 Optional 类来防止 NPE 问题

添加链接描述

添加链接描述

五、mysql数据库

(一)建表规约

  1. 【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只
    出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。

mysql中文文档的官方保留字

  1. 【强制】主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名
    说明:pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。

主键与唯一索引的区别

  1. 【强制】小数类型为 decimal,禁止使用 float 和 double。
    说明:在存储的时候,float 和 double 都存在精度损失的问题,很可能在比较值的时候,得到不正确的
    结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数并分开存储。

我才是真的封不觉

常用应用尤其是必备字段的time,每张表都必须必备并更新

  1. 【强制】varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度
    大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效
    率。
  2. 【强制】表必备三字段:id, create_time, update_time。 说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime
    类型,前者现在时表示主动式创建,后者过去分词表示被动式更新。
    7. 【强制】更新数据表记录时,必须同时更新记录对应的 update_time 字段值为当前时间。

13.【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循: 1) 不是频繁修改的字段。 2) 不是唯一索引的字段。 3) 不是 varchar 超长字段,更不能是 text 字段。 正例:各业务线经常冗余存储商品名称,避免查询时需要调用 IC 服务获取。

(二)索引规约
。。。我这个菜鸡写的sql常常耗时很长

  1. 【强制】超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询时, 保证被关联的字段需要有索引。 说明:即使双表 join 也要注意表索引、SQL 性能。
  2. 【推荐】如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合索
    引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。 正例:where a=? and b=? order by c; 索引:a_b_c 反例:索引如果存在范围查询,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引 a_b 无 法排序。
  3. 【推荐】建组合索引的时候,区分度最高的在最左边。
    正例:如果 where a=? and b=?,a 列的几乎接近于唯一值,那么只需要单建 idx_a 索引即可。
    说明:存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如:where c>? and d=?
    那么即使 c 的区分度更高,也必须把 d 放在索引的最前列,即建立组合索引 idx_d_c。

一些常见的优化
(三)SQL语句
关于NULL

  1. 【强制】不要使用 count(列名)或 count(常量)来替代 count(),count()是 SQL92 定义的标
    准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
    说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
  2. 【强制】count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct col1, col2) 如果其中一列全为 NULL,那么即使另一列有不同的值,也返回为 0。
  3. 【强制】当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为 NULL,因此使用 sum()时需注意 NPE 问题。 正例:可以使用如下方式来避免 sum 的 NPE 问题:SELECT
    IFNULL(SUM(column), 0) FROM table;
  4. 【强制】使用 ISNULL()来判断是否为 NULL 值。 说明:NULL 与任何值的直接比较都为 NULL。 1) NULL<>NULL 的返回结果是 NULL,而不是 false。 2) NULL=NULL 的返回结果是 NULL,而不是 true。
    3) NULL<>1 的返回结果是 NULL,而不是 true。 反例:在 SQL 语句中,如果在 null
    前换行,影响可读性。select * from table where column1 is null and column3 is
    not null; 而ISNULL(column)是一个整体,简洁易懂。从性能数据上分析,ISNULL(column)
    执行效率更快一些。

11.【推荐】in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控 制在 1000 个之内。

常见命名规范

10.【推荐】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

(四)ORM映射
#{}与${}

  1. 【强制】sql.xml 配置参数使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注入。

六、工程结构

  1. 【推荐】所有 pom 文件中的依赖声明放在dependencies语句块中,所有版本仲裁放在
    dependencyManagement语句块中。
    说明:dependencyManagement里只是声明版本,并不实现引入,因此子项目需要显式的声明依赖,
    version 和 scope 都读取自父 pom。而dependencies所有声明在主 pom 的dependencies里的依
    赖都会自动引入,并默认被所有的子项目继承。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耳东哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值