一、底层定位全自动 ORM vs 半自动 SQL 映射1. Hibernate全自动化 ORM 框架ORM对象关系映射完全屏蔽 SQL核心思想操作 Java 实体对象框架自动生成SQL 执行不用手写大部分增删改查 SQL只写 HQL/JPQL 面向对象查询语句封装完整自动处理表关联、外键、级联操作、事务、缓存2. MyBatis半自动化持久层框架SQL 映射框架SQL 控制权交给开发者核心思想Java 实体 ↔ 手动编写的 SQL 语句双向绑定必须自己写 XML / 注解 SQL框架只负责参数封装、结果集映射不屏蔽数据库底层灵活控制 SQL 细节例子一、先准备统一实体表两边共用一张 user 表数据库表t_userCREATE TABLE t_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20), age INT );Java 实体类public class User { private Integer id; private String username; private Integer age; // getter/setter }二、Hibernate 示例全自动 ORM几乎不写 SQL1. 只需注解映射实体不用写任何 SQL 文件Entity Table(name t_user) public class User { Id GeneratedValue(strategy GenerationType.IDENTITY) private Integer id; private String username; private Integer age; // getter、setter }2. 新增用户只操作对象框架自动生成 insert SQLSession session sessionFactory.openSession(); Transaction tx session.beginTransaction(); User user new User(); user.setUsername(张三); user.setAge(20); session.save(user); // 一行代码不用写insert语句 tx.commit(); session.close();底层 Hibernate 自动生成执行 SQLinsert into t_user (username, age) values (?, ?)3. 根据 id 查询对象操作对象自动 selectUser user session.get(User.class, 1); System.out.println(user.getUsername());自动生成 SQLselect user0_.id as id1_0_0_, user0_.username as username2_0_0_, user0_.age as age3_0_0_ from t_user user0_ where user0_.id?4. 复杂查询写 HQL面向对象不是表名// 查年龄大于18的用户写类名User不是表t_user String hql from User where age 18; Query query session.createQuery(hql); ListUser list query.list();你看不到表、字段只操作 Java 类和属性框架内部翻译为原生 SQL 执行。三、MyBatis 示例半自动所有 SQL 必须自己手写1. Mapper 接口public interface UserMapper { // 新增用户 int insertUser(User user); // 根据id查询 User selectById(Integer id); // 查询18岁以上用户 ListUser selectOver18(); }2. 必须手动写 XML自己写完整 SQLUserMapper.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.mapper.UserMapper !-- 自己手写insert SQL -- insert idinsertUser insert into t_user(username, age) values(#{username}, #{age}) /insert !-- 自己手写select SQL -- select idselectById resultTypecom.pojo.User select id,username,age from t_user where id #{id} /select !-- 复杂查询自己写原生SQL直接操作表t_user -- select idselectOver18 resultTypecom.pojo.User select * from t_user where age 18 /select /mapper3. 调用代码UserMapper mapper sqlSession.getMapper(UserMapper.class); // 新增 User u new User(); u.setUsername(张三); u.setAge(20); mapper.insertUser(u); // 查询 User user mapper.selectById(1); ListUser list mapper.selectOver18();MyBatis 做了什么你写好完整原生 SQLMyBatis 只帮你两件事把 Java 对象参数填充到 SQL#{}占位符把数据库查询结果自动封装成 User 实体 SQL 语句长什么样、怎么联表、加什么索引、分页语法完全由你控制。二、开发方式对比1. Hibernate只定义实体类 映射文件 / 注解Entity自动映射数据库表简单 CRUD 直接调用 APIsave()/update()/delete()/get()无 SQL复杂查询写 HQL面向对象和数据库无关或 Criteria 动态查询分页、多表关联、批量操作由框架封装优点开发速度极快小型项目少写大量 SQL缺点自动生成 SQL 不可控复杂场景容易产生低效、冗余 SQL2. MyBatis实体 Mapper 接口 XML 映射文件每条业务逻辑对应一条手写 SQLCRUD 全部手动编写 SQL支持原生数据库函数、存储过程动态 SQL 用ifwhereforeach标签拼接灵活定制分页、多表联查、性能优化完全由开发人员控制 SQL优点SQL 可控方便调优适配复杂报表、多表大数据场景缺点重复工作量大简单单表操作也要写大量 XML三、数据库耦合程度1.Hibernate 低耦合跨数据库友好HQL 不依赖数据库方言切换 MySQL/Oracle 只需改配置方言自动适配不同数据库分页、函数语法适合需要多数据库兼容的系统代价底层 SQL 统一封装会牺牲部分数据库独有特性2.MyBatis 高耦合绑定原生 SQL直接写原生 SQL大量使用数据库专属函数、分页语法时切换库要改 SQL可直接使用数据库特有性能特性Oracle 序列、MySQL 索引提示互联网大数据、金融系统首选追求 SQL 极致性能四、缓存机制1. Hibernate 完整两级缓存一级缓存Session 缓存默认开启同一次会话重复查询直接读取内存减少 DB 访问二级缓存全局 SessionFactory 缓存可配置 Redis 等跨会话共享缓存适合查询多、修改少的静态数据 缓存全自动管理无需手动处理缓存失效但批量更新易出现缓存脏数据。2. MyBatis 简单两级缓存一级缓存SqlSession 缓存默认开启仅当前会话生效会话关闭缓存清空二级缓存Mapper 级别缓存手动开启按 Mapper 文件隔离缓存颗粒度粗分布式场景容易脏读 MyBatis 缓存轻量实际生产中大多直接用 Redis 替代自带二级缓存。五、表结构操作Hibernate 支持自动建表配置hibernate.hbm2ddl.auto可自动创建 / 更新表结构快速搭建测试环境生产不推荐自动更新表。MyBatis 无自动建表能力表结构必须手动执行 SQL 脚本创建。六、适用场景选 Hibernate / JPASpring Data JPA 底层就是 Hibernate中小型内部管理系统、后台 CRUD 系统业务简单、单表多、关联少追求快速开发产品需要兼容多种数据库迭代快、SQL 简单无复杂统计报表选 MyBatis主流互联网框架互联网高并发、大数据量系统电商、支付、股票、大数据报表复杂多表联查、统计分析、海量分页需要精细 SQL 调优、索引优化、存储过程团队 DBA 严格管控 SQL要求所有 SQL 可审计仅使用单一数据库不需要跨库兼容七、简短总结对照表维度Hibernate(JPA)MyBatisSQL 编写自动生成少手写全部手动编写开发效率高简单业务超快偏低重复 SQL 多SQL 可控性弱难优化慢 SQL强自由调优数据库兼容性好切换库改动小差换库需改 SQL缓存完整两级缓存自动管理简易缓存分布式慎用学习成本高理解持久态、缓存、级联低只需懂 SQL 基础映射行业使用传统 ERP、后台管理系统互联网、高并发、金融项目补充Spring Data JPA现在很少直接裸用 Hibernate大多封装为 Spring Data JPA底层仍是 Hibernate而 MyBatis 对应封装为 MyBatis-Plus提供单表自动 CRUD弥补 MyBatis 单表写 SQL 麻烦的短板。