Hibernate(JPA) 和 MyBatis 的对比
来看看 Hibernate(JPA) 和 MyBatis 的“ORM 自动化”区别。
✅ 目标:从数据库查询一个用户 User
实体
CREATE TABLE user (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255),
age INT
);
🔶 Hibernate(JPA) 实现:全自动 ORM 映射
你不写 SQL,只写方法名,JPA 自动帮你生成 SQL。
🧱 实体类
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private Integer age;
// getter, setter
}
🧱 Repository 接口
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByUsername(String username); // 自动生成 SELECT * FROM user WHERE username = ?
}
🧱 使用示例
@Autowired
private UserRepository userRepository;
public void testJPA() {
List<User> users = userRepository.findByUsername("Tom");
// 自动查出结果,无需写 SQL!
}
🔷 MyBatis 实现:手写 SQL 映射
你需要自己写 SQL 或用注解,灵活但不自动。
🧱 实体类(MyBatis 也可复用)
public class User {
private Long id;
private String username;
private Integer age;
// getter, setter
}
🧱 Mapper 接口 + XML
@Mapper
public interface UserMapper {
List<User> selectByUsername(@Param("username") String username);
}
对应的 XML 配置
<select id="selectByUsername" parameterType="String" resultType="User">
SELECT * FROM user WHERE username = #{username}
</select>
🧱 使用示例
@Autowired
private UserMapper userMapper;
public void testMyBatis() {
List<User> users = userMapper.selectByUsername("Tom");
// 需要自己写 SQL
}
✅ 总结对比表
比较项 | Hibernate(JPA) | MyBatis / MyBatis-Plus |
---|---|---|
SQL 自动生成 | ✅ 是(通过方法名推导) | ❌ 否(需手写或注解) |
自由写复杂 SQL | ❌ 不方便,需用 @Query | ✅ 灵活手写(或注解方式) |
ORM 映射 | ✅ 自动生成表结构、字段映射 | ❌ 需手动绑定字段 |
学习曲线 | ⭐⭐ 快速上手 | ⭐⭐⭐⭐ 灵活但复杂 |
动态 SQL 支持 | ❌ 弱 | ✅ 支持 if/choose 等条件语句 |
分页查询 | ✅ Pageable | ✅ PageHelper/MyBatis-Plus |
🎯 建议
- 如果你是 CRUD 多、复杂 SQL 少,✅ 推荐用 JPA(快速开发)
- 如果你是 查询逻辑复杂、动态 SQL 多,✅ 推荐用 MyBatis-Plus(灵活)