四、ORM规约
【推荐】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。
说明: 1)增加查询分析器解析成本。 2) 返回不必要的多余字段,增加额外网络传输数据。
【强制】POJO 类的 Boolean 属性不能加 is,而数据库字段必须加 is_ 。
【强制】禁止使用本地SQL查询,可以用JPA 命名查询 @Query 代替,本地SQL查询与数据库类型绑定,不利于扩展迁移。
正例: public interface BlogRepository extends JpaRepository<Blog,Long>{ @Query("select blog from Blog blog where blog.user.login = ?#{principal.username}") List<Blog> findByUserIsCurrentUser(); } 反例: public interface BlogRepository extends JpaRepository<Blog,Long> { @Query(nativeQuery=true,value="select * from BlogTable blog blog , UserTable user where blog.user_id = user.id and user.id = ? ") List<Blog> findByUserIsCurrentUser( Long userId); }
【推荐】在实体类之间有一对多,多对多关系,尽量避免双向关联,尽量在多的一侧关联,默认 为懒加载,根据需要在业务实现时,在业务服务类例根据需要决定是否加载,禁止 FetchType.EAGER。
【强制】不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。
【推荐】不要写一个大而全的数据更新接口,传入为 POJO 类,不管是不是自己的目标更新字 段,都进行 update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行 SQL 时,尽量不要更新无改动的字段,一是易出错;二是效率低;三是增加 binlog 存储。
【参考】@Transactional 事务不要滥用。事务会影响数据库的 QPS,另外使用事务的地方需 要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等,在业务服务类例更新多个实体时,必须显性的在方法添加 @Transactional。
【参考】<isEqual>中的 compareValue 是与属性值对比的常量,一般是数字,表示相等时带 上此条件;<isNotEmpty>表示不为空且不为 null 时执行;<isNotNull>表示不为 null 值时 执行。