• java代码规范 (精选阿里云代码规范)


    Mysql

    1. 表达是与否概念的字段,必须使用 is _ xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否 )
    2. 主键索引名为 pk_ 字段名;唯一索引名为 uk _字段名 ; 普通索引名则为 idx _字段名。
    3. 小数类型为 decimal ,禁止使用 float 和 double 。
    4. 表必备三字段: id , gmt _ create , gmt _ modified
    5. 表的命名最好是加上“业务名称_表的作用”
    6. 超过三个表禁止 join 。需要 join 的字段,数据类型必须绝对一致 ; 多表关联查询时,
      保证被关联的字段需要有索引。
    7. 页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。索引文件具有 B - Tree的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引。
    8. 不要使用 count( 列名 ) 或 count( 常量 ) 来替代 count( * ) , count( * ) 是 SQL 92 定义的
      标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。count( * ) 会统计值为 NULL 的行,而 count( 列名 ) 不会统计此列为 NULL 值的行。
    9. count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct
      col 1, col 2 ) 如果其中一列全为 NULL ,那么即使另一列有不同的值,也返回为 0。
    10. 当某一列的值全是 NULL 时, count(col) 的返回结果为 0,但 sum(col) 的返回结果为
      NULL ,因此使用 sum() 时需注意 NPE 问题。可以使用如下方式来避免 sum 的 NPE 问题: SELECT IF(ISNULL(SUM(g)) ,0, SUM(g)) FROM table;
    11. 使用 ISNULL() 来判断是否为 NULL 值。NULL 与任何值的直接比较都为 NULL。
    12. 在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句。
    13. 不得使用外键与级联,一切外键概念必须在应用层解决。

    ORM映射

    1. 在表进行查询中一律不使用*作为查询字段列表,需要那些字段必须写明。
    2. pojo属性不能加is,数据库字段必须加is_,需要在mybatis生成器中将代码进行修改。
    3. sql.xml配置参数使用 #{},不要使用${}这种方式容易出现SQL注入
    4. 不允许直接拿HashMap和HashTable作为查询结果集的输出。
    5. 事务不要滥用,事务影响数据库的QPS,使用事务的地方需要考虑各方面的回滚。

    SQL语句

    1. count(distinct col) 计算该列除NULL之外的不重复行,注意count(distinct col1,col2)如果其中一列全为null,即使另一列有不同值也返回0。
    2. 当某一列值全为null,count(col)返回结果为0,sum(col)返回结果为NULL,因此Sum(col)要注意NPE问题。可以用
    select if(isnull(sum(g)),0,sum(g)) from table;
    
    1. 使用ISNULL()来判断是否为NULL值,NULL值与任何值比较都为NULL值。
    2. 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
    3. 数据订正时,删除和修改记录,要先select,避免出现误删除,确认无误避免出现误删除。
    4. in操作能避免则避免,实在不能避免要估计in后边集合的数量,控制在1000个之内。
    5. 如果有全球化的需要,所有的字符存储以utf-8来进行存储,同时注意
    select length("轻松工作");返回12
    select character_length("轻松工作"); 返回4
    

    存储表情用utfmb4来进行存储,注意它与utf-8的区别。

    8.不建议使用truncate

    索引规约

    1. 业务上具有唯一特性的字段,即使多个字段的组合,也必须构建唯一索引。
    2. 在varchar上创建索引,必须指明索引的长度,没有必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
    count(distinct left(列名,索引长度))/count(*)
    
    1. 如果有order by 的场景,请注意利用索引的有序性。order by最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影响查询性能。
    索引 a_b_c      where a = ? and b = ? order by c 
    

    索引中有范围查找时,索引的有序性无法利用,where a > 10 order by b; 索引 a_b无法发生。

    1. 利用覆盖索引来进行查询,避免回表,能够建立索引的种类:主键索引、唯一索引、普通索引、而覆盖索引是一种查询的一种效果,用explain的结果,extra列会出现,using index

    2. 利用延迟关联或者子查询优化差多分页场景。

    3. SQL的性能目标,至少要达到range级别,要求是ref级别,如果可以是consts最好
      consts单表中最多只能有一个匹配行,在优化阶段即可读取到数据
      ref 指的是使用普通索引
      range 对于索引进行范围检索

    4. 建立组合索引的时候,区分度最高的在最左面,如果 where a = ? and b = ? a列几乎接近于唯一值,那么只需要单建idx_a索引即可。
      存在非等号和等号混合判断条件时,在创建索引时,请把等号条件的列前置。
      where a > ? and b = ? 即使a的区分度很高也需要b放在索引最前面。

    5. 防止字段类型不同所造成的隐式转化,导致索引失效。

    6. 创建索引要避免宁滥勿缺,认为查询需要创建一个索引,宁缺勿滥也不要,认为索引会消耗空间,拖慢更新和新增速度。
      抵制唯一索引,认为唯一索引需要在应用层通过先查后插方式解决。

    7. varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出一张表,用主键来对应,避免影响其他字段索引效率。

    8. 单行表数据超过500万或者单行表容量超过2GB,才推荐进行分库分表。

    9. 合适的字符存储长度,不但节约数据库的表空间,节约索引的存储,更重要的是提升检索速度。

    安全规约

    1. 用户个人的页面必须进行权限校验。

    2. 用户敏感数据禁止直接展示,必须脱敏,手机号隐藏中间4位。

    3. 用户输入的sql参数严格禁止使用参数绑定或者metadata字段值限定,防止SQL注入,禁止字符串拼接SQL访问数据库。

    4. 用户请求传入的参数必须进行有效的验证:否则导致1.page size 过大内存溢出 2. 恶意order by 导致数据库查询慢3.任意重定向 4.SQL注入 5. 反序列化注入 6. 正则输入源串拒绝服务ReDos

    5. 禁止向HTML页面输出未经安全过滤或未正确转义的用户数据。

    6. 表单、AJAX提交必须执行CSRF安全过滤。
      CSRF跨站请求伪造是一类常见的编程漏洞,对于存在CSRF漏洞的应用网站,攻击者可以事先构造好URL,只要受害用户一访问,后台便在用户不知情的情况下对数据库进行修改。

    7. 单元测试可以重复执行,不能受外界环境的影响,在设计时就要把SUT改为注入,在测试时使用spring这样的DI框架注入一个本地实现。

    异常处理

    1. java 类库中定义的一类RuntimeException可以通过预先检查进行规避,而不应该通过catch进行处理,比如IndexOutOfBoundsException,NullPointerException

    2. 有try块放到事务代码中,catch后,需要事务回滚,一定注意手动回滚。

    3. 不能在finally中使用return,finally块中的return返回方法后结束执行,不会再执行try中return语句。

    4. 方法的返回值可以为null,不强制返回空集合和空对象,必须添加注释说明什么情况下返回为空

    其他

    1. 在使用正则表达式时要学会利用预编译,加快正则匹配速度,定义正则的时候不要在方法体内进行定义。

    2. volocity调用POJO类属性的时候,建议直接使用属性名取值即可,模板引擎会自动按照规约调用Pojo的getXxx(),如果是boolean基本数据类型调用 isXxx(),如果Boolean包装对象,调用getXxx()的方法

    3. 后台输出给页面的变量必须加 ! !{var} 中间感叹号,如果var = null 不存在那么{var} 会显示在页面上。

    4. 任何数据结构构造和初始化,都应该指定大小,避免数据结构无限增长吃光内存。

    5. 对于暂时被注释掉,后续可能恢复使用的代码片段,统一使用///来说明注释掉代码的理由



    作者:张晓天a
    链接:https://www.jianshu.com/p/6a88cf7b18e8
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    假如我的博客对你有用,请你关注我一下,告诉我你来过,你的关注是我前进的动力,希望更多的人记录自己的问题,去帮助别人更是帮助自己避免再次出现这样那样的问题,谢谢你的来过!
  • 相关阅读:
    [转]ThinkPHP中如何使用原生SQL
    php定时回调接口
    [转]mysql dual虚拟表
    [转]mysql变量使用总结
    [转]使用mysql profiles 来查看sql 语句执行计划
    [转]Mysql中的SQL优化与执行计划
    [转]MySQL单列索引和组合索引的区别介绍
    前端开发框架
    sugar crm
    [转]MCC(移动国家码)和 MNC(移动网络码)
  • 原文地址:https://www.cnblogs.com/zxy-come-on/p/13858665.html
Copyright © 2020-2023  润新知