ORM框架 考试重点

数据访问

对象关系映射:用对象操作关系数据库,减少手写重复 SQL,同时理解其性能与边界。

结构示意
flowchart LR
      E[实体对象] --> ORM[ORM 框架]
      ORM --> T[关系表]
      S[Service] --> E
知识说明
ORM 把表映射为实体类、行映射为对象。Hibernate/JPA 偏对象主导;MyBatis 偏 SQL 映射(半自动)。好处是 CRUD 效率高、类型相对安全;代价是 N+1 查询、脏检查、懒加载陷阱。 架构课关心:它落在数据访问层,不能代替业务层;复杂报表仍可能手写 SQL。
特点
  • 实体映射
  • 会话/工作单元
  • 缓存与懒加载
  • 查询语言或 SQL 映射
优点
  • 减少样板 SQL
  • 切换部分数据库差异
  • 与分层中的 Dao 契合
局限
  • 性能黑盒
  • 复杂查询受限或不直观
  • 学习与调优成本
适用
企业后台 Web 业务系统的数据层
例子展示 —— 用户-角色:JPA 风格映射
问题

每次授权都手写多表 JOIN 与 ResultSet 装配,字段一改全项目替换字符串。

做法

User、Role 用关联映射;授权变为集合操作再 flush。简单 CRUD 变短,但列表页要警惕懒加载导致的 N+1。

erDiagram
        USER ||--o{ USER_ROLE : has
        ROLE ||--o{ USER_ROLE : has
        USER { int id }
        ROLE { int id }
@Entity
class User {
    @Id Long id;
    @ManyToMany Set<Role> roles;
}
class UserService {
    void grant(User u, Role r) {
        u.getRoles().add(r); // 事务结束时同步
    }
}
# SQLAlchemy 示意
class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    roles = relationship("Role", secondary="user_roles")
def grant(user, role):
    user.roles.append(role)