命名规范
1.代码中的命名不能以下划线、美元符开始或结束。
2.不能拼音和英文公用。
3.类名大写开始的驼峰。UpperCamelCase
4.方法名、参数名、成员变量、局部变量统一使用小写开始的驼峰。
5.常量名全部用大写,单词间用下划线,切记要语义表达清楚完整。
6.抽象类命名以Abstract或Base开头,异常类命名使用Exception结尾;测试类以Test结尾。
7.POJO类中的布尔类型的变量,不要以is开头。如:private boolean isGood;的get、set方法,
public boolean isGood() {
return isGood;
}
public void setGood(boolean good) {
isGood = good;
}
set方法的参数变成了good,而不是isGood。
一些Web框架,页面使用框架的标签显示对象的值,就容易取不到,报异常。
8.包名统一使用小写,统一使用单数形式。如com.alibaba.ai.util。而不是utils。
9.杜绝不规范的肆意缩写。如 AbstractClass “缩写”命名成 AbsClass。
10.命名要有解释作用,不能int a。
11.如果模块、接口、类、方法使用了设计模式,命名的时候提现出设计模式,如LoginProxy;OrderFactory;EcodingFileter。
12.接口类中的方法和属性不要加任何修饰符,如public也不要。方法就直接void commit()最好。
因为接口中的每一个方法也是隐式抽象的,方法会被指定为public abstract。
13.对于Service和Dao类,基于SOA理念,暴露出来的服务一定是接口,如CacheService实现CacheServiceImpl接口。
14.枚举类名建议加Enum后缀。
15.Service / DAO 层方法命名规约
1 ) 获取单个对象的方法用 get 做前缀。
2 ) 获取多个对象的方法用 list 做前缀,复数形式结尾如:listObjects。
3 ) 获取统计值的方法用 count 做前缀。
4 ) 插入的方法用 save/insert 做前缀。
5 ) 删除的方法用 remove/delete 做前缀。
6 ) 修改的方法用 update 做前缀。
B) 领域模型命名规约
1 ) 数据对象: xxxDO , xxx 即为数据表名。
2 ) 数据传输对象: xxxDTO , xxx 为业务领域相关的名称。
3 ) 展示对象: xxxVO , xxx 一般为网页名称。
4 ) POJO 是 DO / DTO / BO / VO 的统称,禁止命名成 xxxPOJO 。
常量定义
1.不允许出现任何魔法值(magic value)(即未经预先定义的常量)直接出现在代码中。
如:int kpiValue=8*sqi。8就是魔法值。
2.使用long类型常量时,应用大写的L。小写的容易看成数字1.
3.常量的定义建议通过命名来分类,提高可读性和方便查找。如:缓存相关的常量命名为CACHE_XXXX。
代码格式
1.大括号的使用,内容为空则写成{},不为空则如下
if (a!=c){
a=b+c;
}else{
}
2.小括号左右不留空格,反例:( a==b )。
3.if / for / while / switch / do 等保留字与括号之间都必须加空格。
4.任何二目三目运算符,左右两边各加一个空格。a&&b a<b?b:c
public static void main(String[] args) {
// 缩进 4 个空格
String say = "hello";
// 运算符的左右必须有一个空格
int flag = 0;
// 关键词 if 与括号之间必须有一个空格,括号内的 f 与左括号,0 与右括号不需要空格
if (flag == 0) {
System.out.println(say);
}
// 左大括号前加空格且不换行;左大括号后换行
if (flag == 1) {
System.out.println("world");
// 右大括号前换行,右大括号后有 else,不用换行
} else {
System.out.println("ok");
// 在右大括号后直接结束,则必须换行
}
}
5.注释的双斜线与注释内容之间必须有个空格。
6.当行不超过120个字符,超出需换行,第二行相对第一行加4个空格。点符号、运算符与下文一同换行。
7.方法参数在定义和传入时,多个参数逗号后面必须加空格。method(arg1, arg2, arg3).
8.IDE 的 text file encoding 设置为 UTF -8 ; IDE 中文件的换行符使用 Unix 格式,不要使用 Windows 格式。
9.不要为了多行之间对齐而胡乱加空格。
10.任何情形,都没有必要出入多个空行进行隔开。
ORM映射
1.在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
说明:1 ) 增加查询分析器解析成本。2 ) 增减字段容易与 resultMap 配置不一致。3)无用字
段增加网络消耗,尤其是 text 类型的字段。
2.POJO 类的布尔属性不能加 is ,而数据库字段必须加 is _。
3.不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需
要定义。
4.sql. xml 配置参数使用:#{},# param # 不要使用${} 此种方式容易出现 SQL 注入。
5.iBATIS 自带的 queryForList(String statementName , int start , int size) 不推
荐使用。
6.不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。
建表规约
1.表达是与否的字段,必须使用is_xxxx的方式命名,数据类型是unsigned tinyint。
2.表名、字段名必须使用小写字母或数字 , 禁止出现数字开头,禁止两个下划线中间只
出现数字。 MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。
3.表名不使用复数名词。
4.禁用保留字,如 desc 、 range 、 match 、 delayed 等。
5.主键索引名为 pk_ 字段名;唯一索引名为 uk _字段名 ; 普通索引名则为 idx _字段名。
说明: pk_ 即 primary key;uk _ 即 unique key;idx _ 即 index 的简称。
6.小数类型为 decimal ,禁止使用 float 和 double 。
7.如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
8.varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长
度大于此值,定义字段类型为 text ,独立出来一张表,用主键来对应,避免影响其它字段索
引效率。
9.表必备三字段: id , gmt _ create , gmt _ modified。其中 id 必为主键,类型为 bigint unsigned 、单表时自增、步长为 1。 gmt_create,gmt_modified 的类型均为 datetime 类型,前者现在时表示主动创建,后者过去分词表示被动更新。
10.表的命名最好是加上“业务名称_表的作用”。
11.库名与应用名称尽量一致。
12.单表行数超过 500 万行或者单表容量超过 2 GB ,才推荐进行分库分表。如果预计三年后的数据量根本达不到这个级别,不建议分表分库。
13.合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检
索速度。其中无符号值可以避免误存负数。
SQL语句
1.不要使用 count( 列名 ) 或 count( 常量 ) 来替代 count( * ) , count( * ) 会统计值为 NULL 的行,而 count( 列名 ) 不会统计此列为 NULL 值的行。
2.count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct col 1, col 2 ) 如果其中一列全为 NULL ,那么即使另一列有不同的值,也返回为 0。
3.当某一列的值全是 NULL 时, count(col) 的返回结果为 0,但 sum(col) 的返回结果为
NULL ,因此使用 sum() 时需注意 NPE 问题。
4.在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。
5.不得使用外键与级联,一切外键概念必须在应用层解决。外键与级联更新适用于单机低并发,不适合分布式、高并发集群 ; 级联更新是强阻塞,存在数据库更新风暴的风险 ; 外键影响数据库的插入速度。
6.禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
7.数据订正(特别是删除、修改记录操作)时,要先 select ,避免出现误删除,确认
无误才能执行更新语句。
8.in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控
制在 1000 个之内。
9.如果有国际化需要,所有的字符存储与表示,均以 utf -8 编码,注意字符统计函数
的区别。如果需要存储表情,那么选择 utf8mb 4 来进行存储,注意它与 utf -8 编码的区别。
10.TRUNCATE TABLE 不记录在日志中,所以无事务且不触发 trigger。谨慎使用。TRUNCATE 删除数据,不留日志。不带WHERE的DELETE语句有日志,可以ROLLBACK。而DROP TABLE则删除表结构。
安全规约
1.隶属于用户个人的页面或者功能必须进行权限控制校验。
2.用户敏感数据禁止直接展示,必须对展示数据进行脱敏。
3.用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入,
禁止字符串拼接 SQL 访问数据库。
4.禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。
5.表单、AJAX 提交必须执行 CSRF 安全验证。
6.在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放的机
制,如数量限制、疲劳度控制、验证码校验,避免被滥刷而导致资损。
7.发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过
滤等风控策略。