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)