← 返回目录

(四) ORM映射

第 20 / 27 卷作者:guanbao yang日期:

正例:select t1.name from first_table as t1 , second_table as t2 where t1.id = t2.id;

反例:在某业务中,由于多表关联查询语句没有加表的别名(或表名)的限制,正常运行两年后,最近在某个表中增加一个同名字段,在预发布环境做数据库变更后,线上查询语句出现出 1052 异常:

Column 'name' infield list is ambiguous。

10.【推荐】SQL 语句中表的别名前加 as,并且以 t1、t2、t3、...的顺序依次命名。

说明:

1)别名可以是表的简称,或者是依照表在 SQL 语句中出现的顺序,以 t1、t2、t3 的方式命名。

2)别名前加 as 使别名更容易识别。

正例:select t1.name from first_table as t1 , second_table as t2 where t1.id = t2.id;

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

12.【参考】因国际化需要,所有的字符存储与表示,均采用 utf8mb4 字符集,字符计数方法需要注意。

说明:

SELECT LENGTH("轻松工作");--返回为 12 SELECT CHARACTER_LENGTH("轻松工作");--返回为 4

表情需要用 utf8mb4 来进行存储,注意它与 utf8 编码的区别。

13.【参考】TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 trigger,有可能造成事故,故不建议在开发代码中使用此语句。

说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

(四) ORM 映射

1.【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。

说明:

1)增加查询分析器解析成本。

2)增减字段容易与 resultMap 配置不一致。

3)无用字段增加网络消耗,尤其是 text类型的字段。

2.【强制】POJO 类的布尔属性不能加 is,而数据库字段必须加 is_,要求在 resultMap 中进行字段与属性之间的映射。

说明:参见定义 POJO 类以及数据库字段定义规定,在 sql.xml 增加映射,是必须的。

3.【强制】不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义 <resultMap>;反过来,每一个表也必然有一个<resultMap>与之对应。

说明:配置映射关系,使字段与 DO 类解耦,方便维护。

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

5.【强制】iBATIS自带的 queryForList(String statementName,int start,int size) 不推荐使用。

说明:其实现方式是在数据库取到 statementName 对应的 SQL 语句的所有记录,再通过 subList 取 start,size 的子集合,线上因为这个原因曾经出现过 OOM。

正例:

Map<String, Object> map = new HashMap<>(16);

日常是把 bigint转成 Long 值,而线上由于数据库版本不一样,解析成 BigInteger,导致线上问题。

7.【强制】更新数据表记录时,必须同时更新记录对应的 update_time 字段值为当前时间。

8.【推荐】不要写一个大而全的数据更新接口。传入为POJO 类,不管是不是自己的目标更新字段,都进行 update table set c1 = value1 , c2 = value2 , c3 = value3;这是不对的。执行 SQL 时,不要更新无改

动的字段,一是易出错;二是效率低;三是增加 binlog 存储。

9.【参考】@Transactional 事务不要滥用。事务会影响数据库的 QPS,另外使用事务的地方需要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。

10.【参考】<isEqual>中的 compareValue 是与属性值对比的常量,一般是数字,表示相等时带上此条件;<isNotEmpty>表示不为空且不为 null 时执行;<isNotNull>表示不为 null 值时执行。

全站分卷索引 · 27 卷
  1. 1一、编程规约
  2. 2(二) 常量定义
  3. 3(三) 代码格式
  4. 4(四) OOP规约
  5. 5(五) 日期时间
  6. 6(六) 集合处理
  7. 7(七) 并发处理
  8. 8(八) 控制语句
  9. 9(九) 注释规约
  10. 10(十) 前后端规约
  11. 11(十一) 其他
  12. 12二、异常日志
  13. 13(二) 异常处理
  14. 14(三) 日志规约
  15. 15三、单元测试
  16. 16四、安全规约
  17. 17五、MySQL数据库
  18. 18(二) 索引规约
  19. 19(三) SQL语句
  20. 20(四) ORM映射
  21. 21六、工程结构
  22. 22(二) 二方库依赖
  23. 23(三) 服务器
  24. 24七、设计规约
  25. 25附1:版本历史
  26. 26附2:专有名词解释
  27. 27附3:错误码列表