JAVA开发规约
命名规则
-
命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例: name / __name / $Object / name / name$ / Object$
- 命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。国际通用的名称,可视同英文。如:youku、taobao。
- 类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DAO / DTO 。如:UserDAO, UserDTO, UserEntity。
- 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。如:getSystemConfig。
- 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。如:SUSPECT_STATUS_FORCE
- 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾
- 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词
- 枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。如:CaseOperEnum.ACCESS
常量定义
- long 或者 Long 初始赋值时,使用大写的 L,不能是小写的 l,小写容易跟数字 1 混 淆,造成误解。
- 不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。如:ConfigConsts, ResultMsgConsts。
- 如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。如:案件状态、用户状态。
- 定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
- 所有的POJO类属性必须使用包装数据类型。如:Integer, Long。不要使用 int, long。 代码格式
- 尽量使用 IDE 提供的代码格式化工具。
- 一行代码不要过长,通常 IDE 可以设置一条纵向的边界线,达到边界线表示代码要换行了。通常单行字符数限制不超过 120 个。
- IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式, 不要使用 Windows 格式。
注释格式
- 类、类属性、类方法的注释必须使用 Javadoc 规范,使用/*内容/格式,不要使用 // xxx方式。在 IDE 编辑窗口中,Javadoc 方式会提示相关注释。
- 方法内部单行注释,在被注释语句上方另起一行,使用//注释
- 所有的枚举类型字段必须要有注释
- 待办事宜(TODO)表示需要实现,但目前还未实现的功能。IDE 也会有提示有功能未完成,防止遗忘。
工程结构
- DAO。Data Access Object。与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
- DTO。Data Transfer Object。数据传输对象,Service 或 Controller 向外传输的对象。
- Service/Impl。业务实现层。和底层通过 Entity 进行交互,返回 DTO。
- Controller。和 WEB 交互层,通过 DTO 进行数据传输,并调用 Service 。
各层可以再按功能模块划分。如: Dao/Case Dao/Sys Controller/Case Controller/Sys Service/Case Service/Sys 或者先划分模块,再按层级划分。如: Sys/Dao Sys/Controller Sys/Service Case/Dao Case/Controller Case/Service
数据库设计
建表
- 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint ( 1表示是,0表示否)。
- 禁用保留字,如 desc、range、match、delayed 等
- 主键索引名为 pk字段名;唯一索引名为 uk字段名;普通索引名则为 idx字段名。 如:pk 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称。
- 小数类型为 decimal,禁止使用 float 和 double。
- 如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
- varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长 度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。
- 字段允许适当冗余,以提高查询性能
索引
- 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明 显的;另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,必然有脏数据产生。
- 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据 实际文本区分度决定索引长度
- 注意最左原则的索引特性。另外,如果有范围查询,后面的索引会失效。
- 利用延迟关联或者子查询优化超多分页场景。如: SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
- 建组合索引的时候,区分度最高的在最左边。索引的目标就是过滤掉更多的不要的行。比如用户的年龄和性别。可以性别在前,年龄在后。因为性别一次就可以过滤掉一半数据。
SQL语句
- 不要使用 count(列名)或 count(常量)来替代 count()。count()是 SQL92 定义的 标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
- count(distinct col) 计算该列除 NULL 之外的不重复行数。
- 当某一列的值全是 NULL 时,count(col)的返回结果为 0,但 sum(col)的返回结果为 NULL,因此使用 sum()时需注意 NPE 问题。
- 使用 ISNULL()来判断是否为 NULL 值。 NULL<>NULL的返回结果是NULL,而不是false。 NULL<>1的返回结果是NULL,而不是true。 NULL=NULL的返回结果是NULL,而不是true。
- 在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。
- 不使用外键与级联,外键概念在应用层解决。
- 不要使用存储过程
- in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控 制在 1000 个之内。
- TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 trigger,有可能造成事故
MyBatis
- 表查询中,不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
- xml 配置参数使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注入。
- 不要直接拿 HashMap 与 Hashtable 作为查询结果集的输出。自己定义 Dto。
- 更新时,只更新改动了的字段。可以新建一个 Entity,只给 id 和变动了的字段赋新值然后 save()。