MySQL 数据库铁律( 二 )


【MySQL 数据库铁律】外键与级联禁止使用外键与级联,一切外键概念必须在应用层解决 。原因:外键与级联不适合分布式、高并发集群,级联更新是强阻塞,存在数据库更新风暴的风险,外键影响数据库的插入速度 。强制
存储过程禁止使用存储过程,存储过程难以调试和扩展,更没有移植性 。强制
数据订正数据订正(特别是删除、修改记录操作)时要先 select,避免出现误删除,确认无误后才能执行更新语句 。强制
inin 操作能避免就避免,如果实在避免不了,in 后面的集合元素数量要控制在 1000 个以内 。推荐
truncate table禁止使用 truncate table,truncate table 比 delete 速度快,且使用的系统和日志资源少,但是 truncate 无事务且不触发 trigger,有可能造成事故,故不要在开发代码中使用此语句 。参考
5.ORM映射铁律
-铁律Level备注
表查询禁止使用 * 作为查询的字段列表,需要哪些字段必须明确 。强制
POJOPOJO 类的布尔属性不能加 is,而数据库字段必须加 is,要求在 resultMap 中进行字段与属性之间的映射 。强制
返回参数禁止用 resultClass 作为返回参数,即使所有类属性名与数据库字段一一对应,也需要定义;反过来,每一个表也必然有一个属性与之对应 。原因:配置映射关系,使字段与 DO 类结耦,方便维护 。强制
返回参数禁止直接使用 HashMap、HashTable 作为查询结果集的输出 。原因:属性值的类型不可控 。强制
sql.xml 配置参数sql.xml 配置参数使用 #{}, #param#,不要使用 ${},${} 容易出现SQL注入 。强制
queryForList禁止使用 Mybatis 自带的 queryForList(String statementName, int start, int size) 。原因:其实现方式是在数据库取到 statementName 对应的 SQL 语句的所有记录,再通过 subList 取 start, size 的子集合 。强制
更新时间更新数据库表记录时,必须同时更新记录对应的修改时间 。强制
更新数据库表记录不要写一个大而全的数据更新接口(传入为 POJO 类) 。执行 SQL 时,不要更新无改动的字段,原因:容易出错、效率低、增加 binlog 存储 。推荐
@Transactional@Transactional 事务不要滥用 。事务会影响数据库的 QPS 。另外,使用事务的地方需要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等 。参考
Mybatis 动态sql标签< isEqual> 中的 compareValue 是与属性值对比的常量,一般是数字,表示相等时执行相应的 SQL 语句;< isNotEmpty> 表示不为空且不为 null 时执行;< isNotNull> 表示不为 null 时执行 。参考
————————————————
版权声明:本文为CSDN博主「郭朝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明 。
原文链接:https://blog.csdn.net/smartbetter/article/details/100160069




推荐阅读