JPA 数据绑定通过 **注解映射** 实现对象与表的关联
Java Persistence API (JPA) 的数据绑定和操作主要通过实体类与数据库表的映射关系来实现。以下是核心机制和操作方式的详细说明:
1. 数据绑定(ORM 映射)
JPA 使用注解将 Java 对象(实体类)映射到数据库表,实现数据绑定:
实体类注解示例:
@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username")private String username;@Column(name = "email")private String email;// 关联关系映射(例如一对多)@OneToMany(mappedBy = "user")private List<Order> orders;// Getter/Setter 省略
}
关键注解说明:
@Entity:标记类为 JPA 实体,与数据库表对应。@Table:指定映射的表名(默认类名即表名)。@Id+@GeneratedValue:定义主键及其生成策略(如自增、UUID)。@Column:映射字段与列(可定制列名、长度、是否可为空等)。- 关联注解(如
@OneToMany、@ManyToOne):定义表间关系。
2. 数据操作
通过 EntityManager 执行数据库操作,核心方法如下:
基本 CRUD 操作:
@PersistenceContext
private EntityManager entityManager;// 新增
public void createUser(User user) {entityManager.persist(user); // 插入数据
}// 查询(按ID)
public User findUserById(Long id) {return entityManager.find(User.class, id); // 查询单个实体
}// 更新
public void updateUser(User user) {entityManager.merge(user); // 合并变更到数据库
}// 删除
public void deleteUser(Long id) {User user = entityManager.find(User.class, id);entityManager.remove(user); // 删除实体
}
查询语言(JPQL):
// 查询所有用户
TypedQuery<User> query = entityManager.createQuery("SELECT u FROM User u WHERE u.email LIKE :email", User.class
);
query.setParameter("email", "%@gmail.com");
List<User> users = query.getResultList();// 原生 SQL 查询
Query nativeQuery = entityManager.createNativeQuery("SELECT * FROM users WHERE username = ?", User.class
);
nativeQuery.setParameter(1, "john");
List<User> result = nativeQuery.getResultList();
条件 API(Criteria API):
// 动态构建查询
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);// 条件:username = "admin"
Predicate condition = cb.equal(root.get("username"), "admin");
query.where(condition);List<User> users = entityManager.createQuery(query).getResultList();
3. 事务管理
使用 @Transactional 确保操作原子性:
@Transactional
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {User fromUser = entityManager.find(User.class, fromId);User toUser = entityManager.find(User.class, toId);fromUser.setBalance(fromUser.getBalance().subtract(amount));toUser.setBalance(toUser.getBalance().add(amount));// 变更自动同步到数据库(事务提交时)
}
4. 高级特性
- 懒加载(Lazy Loading):关联数据(如
orders)在首次访问时才查询。 - 级联操作(Cascade):配置
CascadeType.ALL可自动同步关联实体的增删改。 - 缓存:一级缓存(
EntityManager生命周期)和二级缓存(应用级缓存)。
5. Spring Data JPA 简化操作
通过继承 JpaRepository 进一步简化代码:
public interface UserRepository extends JpaRepository<User, Long> {// 自动生成查询方法List<User> findByUsername(String username);Optional<User> findByEmail(String email);
}
总结
JPA 的数据绑定通过 注解映射 实现对象与表的关联,数据操作依赖 EntityManager 或 Spring Data JPA 封装的接口,结合 JPQL/Criteria API 灵活查询,并通过事务管理保证一致性。这种设计显著减少了直接编写 SQL 的工作量,提升了开发效率。
