入职第一天,行业1部,主要负责石油,政府项目等
java代码规范:
命名规范:代码中的不能以_和$开始和结束
禁止使用拼音和英文混合。
类名使用驼峰命名,首字母大写
方法名首字母不大写,驼峰命名
常量名全部大写,单词间下划线隔开
抽象类用Abstract或Base开头;
异常类使用Exception结尾;
测试类使用类名开头Test结尾
boolean命名前不加is
包名统一使用小写,单数
避免不规范的缩写
如果使用到了设计模式,建议在类名中体现出具体模式
接口类中的方法和属性不要加任何修饰符并加上有效的javadoc注释
接口和实现类的命名有2种规则
Service和Dao类暴露的接口,实现类使用Impl的后缀实现
对形容能力的接口名称,取对应的形容词做接口名
枚举类名建议带上Enum后缀,枚举成员名称全大写,单词间使用下划线隔开
各层命名规范:service/dao:
获取单个对象get前缀
获取对个对象list前缀
获取统计值count前缀
插入方法用save前缀
删除方法remove前缀
修改update前缀
数据对象xxxDo xxx为表名
常量值long类型的赋值必须使用大写例如:Long a = 1L;
不能使用一个常量类维护所用常量,应该按常量的功能分类
格式规范:
大括号内为空{};
否则 {
1
} else {
2
}
if / for / while / switch / do 等保留字与左右括号之间必须加空格
任何一个运算符最有必须加一个空格
缩进采用4空格,禁止使用tab
单行字符数不超过120,超出换行,且:
第二行相对第一行缩进4个空格
运算符与下文一起换行
方法调用的点符号与下文一起换行。
多个参数超长,逗号后换行
在括号前不要换行
方法参数在定义和传入时,多个参数逗号后必须加空格
不能使用过时的类和方法
Object的equals方法容易空指针,应该使用常量或确定有值的对象来调用.equal
使用索引访问用String的split方法得到的数组时,需做最后的一个分隔符有无的检查
当一个类有多个工造方法,或者多个同名方法,这些方法应该按顺序放在一起
循环体内,字符串的联接方式使用StringBuilder的append方式进行扩展
声明final的情况:
不需要重新赋值的变量,包含类属性,局部变量
对象参数前final表示不永续修改引用的指向
类方法确定不允许被重写
控制语句
if-else中尽量不适用else
多次if-else使用状态设计模式
循环体内不使用耗时操作
注释规约:
类,类属性,类方法的注释必须使用javadoc规范,使用/*内容/
所有的抽象方法学习要用javadoc注释,除了返回值,参数,异常说明外,还应该指出做什么,实现什么
所有类都必须添加创建者信息
方法内部单行注释,再被注释语句上方另起一行,使用//注释
所有的枚举类型字段必须要有注释,说明每个数据的用途
其他:
使用正则表达式时,利用好其预编译功能
velocity调用POJO类的属性时,建议直接使用属性名取值即可,模板引擎会自动调用。
后台传输给页面的变量必须加$!{}否则当值为空时会直接显现到页面
Math.random()这个方面返回值是double获取整数是使用Random对象的NextInt或者nextLong
获取当前毫秒数System.currentTimeMillis()
获取纳秒数System.nanoTimer()推荐使用Instant类
尽量不要在velocity模板中加入变量声明,逻辑运算及复杂逻辑
任何数据结构的构造和初始化都应该指定大小
异常处理:
不捕获运行时异常
异常不要用来最流程控制,条件控制,以为异常的处理效率比较低
对于非稳定的代码catch尽可能区分异常类型,在做处理
不能再finally块中使用return,finally块中的return返回方法结束执行不再执行try中的return语句
方法返回值可以为null但必须声明为什么会返回null
定义时区分unchecked / checked异常,避免直接使用exception,应该使用自定义异常
使用日志框架slf4j中的api
日志文件至少保存15天,日志输出必须使用条件输出形式或者使用占位符的方式
避免打印重复日志,在log4j.xml中设置additivity = false.
MySQL规约:
表达是否的概念必须使用is _ xx的方式命名,数据类型为unsigned tinyint 非负数必须使用unsigned
表名,字段名必须使用小写字母和数字;禁止出现数字开头,禁止双下滑线中间只出现数字
表名不使用负数名词
禁用关键字
唯一索引名用uk _ 字段名;普通索引用idx_字段名
小数类型用decimal 禁止使用float和double.,如果存储数据擦超出decimal的范围,建议将数据拆成整数和小数分开存储。
如果存储的字符串长度几乎相等,使用char 定长字符串类型
varchar长度不要超过5000,如果存储长度大于5000,定义字段类型为text,独立出来一张表,用主键来对用,避免影响其他字段索引效率。
表必备三个字段,id,gmt _ create,gmt _ modified.
id为主键,类型为unsigned bigint,单表自增,步长为1.gmt_create,gmt_modified的类型均为date_time类型
表的命名最好是加上“业务名称_表的作用”
数据库名与应用名一致
字段允许适当冗余提高性能,冗余字段应遵守:
不是频繁修改的字段
不是varchar等超长字段
单表行数超过500万或者单表容量超过2GB才推荐使用分库分表
业务上具有唯一特性的字段即使是组合字段,也必须建成唯一索引
超过三个表禁止join。需要join的字段,数据类型保持绝对一致;多表关联查询时,保证保证被关联的字段需要有索引。
在varchar字段上简历索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度。
页面搜索严禁左或者全模糊查询,如果需要使用搜索引擎查询。索引文件具有B-Three的最左前缀匹配特性,若果左边的值未确定那么无法使用此索引。
如果有order by 的场景,请注意利用索引的有序性。
利用覆盖索引来进行查询操作,来避免回表操作。
利用延迟关联或者子查询优化超多分页场景
sql性能优化的目标:至少达到range级别,正常ref,最好consts
consts单表中最多只有一个匹配行,在优化阶段即可读取到数据。
ref指的是使用普通的索引
range对索引进行范围搜索
建组合索引的时候,区分度最高的在最左边
创建索引时注意:
误认一个查询要建一个索引
误认索引会消耗空间,严重拖慢更新和新增速度
误认唯一索引一律需要在应用层先查后插
count(*)统计值为null的行
count (distinct col)计算该列除null外的不重复数量
注:count(distinct col 1,col 2)如果其中一列全为null,那么即使另一列有不同的值,也返回0
当一列全为null时sum(m)返回null,所以使用sum()时注意NPE问题:select if(isnull(sum(g)),0,sum(g)) from table;
使用isNULL()来判断字段是否为空,null与任何值比较都为null
在代码中写分页查询逻辑时,若count为0应该直接返回,避免执行后面的分页语句。
不得使用外键与级联,一切外键概念必须在应用层解决。
禁止使用存储过程,存储过程难以调试和扩展,更没有可移植性
数据修定时,删除和修改记录时,要先select避免误删除
in操作尽量避免,无法避免保证in后面的集合元素数量控制在1000以内
全球化需要,所有的字符存储与表示都用utf-8
存储表情时,使用utfmb 4来存储