四、ORM规约

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

        说明:  1)增加查询分析器解析成本。  2) 返回不必要的多余字段,增加额外网络传输数据。
    
  2. 【强制】POJO 类的 Boolean 属性不能加 is,而数据库字段必须加 is_ 。

  3. 【强制】禁止使用本地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);
    
               }
    
  4. 【推荐】在实体类之间有一对多,多对多关系,尽量避免双向关联,尽量在多的一侧关联,默认 为懒加载,根据需要在业务实现时,在业务服务类例根据需要决定是否加载,禁止 FetchType.EAGER。

  5. 【强制】不允许直接拿 HashMap 与 Hashtable 作为查询结果集的输出。

  6. 【推荐】不要写一个大而全的数据更新接口,传入为 POJO 类,不管是不是自己的目标更新字 段,都进行 update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行 SQL 时,尽量不要更新无改动的字段,一是易出错;二是效率低;三是增加 binlog 存储。

  7. 【参考】@Transactional 事务不要滥用。事务会影响数据库的 QPS,另外使用事务的地方需 要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等,在业务服务类例更新多个实体时,必须显性的在方法添加 @Transactional。

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

results matching ""

    No results matching ""