当前位置: 首页 > news >正文

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(灵活)

相关文章:

  • Java基础关键_036_Stream
  • 使用Python实现矢量路径的压缩、解压与可视化
  • Python | 在Pandas中按照中值对箱形图排序
  • 二叉树的最近公共祖先二叉搜索树的最近公共祖先
  • 25届双非控制硕士求职回顾
  • ARM架构FFmpeg极致优化交叉编译指南
  • Linux:DNS服务配置(课堂实验总结)
  • 怎么免费下载GLTF/GLB格式模型文件,还可以在线编辑修改
  • instructor 库实现缓存
  • 【C#】.NET 8适配器模式实战:用C#实现高可用系统集成与接口桥接艺术
  • AutoGen参数说明
  • Kubernetes中的Label和Selector核心作用与应用场景
  • AI相关视频
  • 字符串与栈和队列-算法小结
  • 驱动开发硬核特训 · Day 10 (理论上篇):设备模型 ≈ 运行时的适配器机制
  • c++中的this
  • 用java代码如何存取数据库的blob字段
  • 02 - spring security基于配置文件及内存的账号密码
  • 设计模式 --- 访问者模式
  • 【LeetCode】算法详解#4 ---合并区间
  • 世卫大会中国代表团:中国深入参与全球卫生治理,为构建人类卫生健康共同体贡献中国力量
  • 官方数据显示:我国心血管疾病患者已超3亿人
  • 俄外长与美国务卿通电话,讨论俄美接触等问题
  • 我使馆就中国公民和企业遭不公正待遇向菲方持续提出严正交涉
  • 四川内江警方通报一起持刀伤人致死案:因车辆停放引起,嫌犯被抓获
  • 向猫学习禅修之后,你会发现将生活降格为劳作是多么愚蠢