通俗易懂!2025 年真实情况:Spring 怎么整合 ORM(Hibernate / MyBatis)
一句话结论 + 一张表记住谁才是王道!
| 框架 | 2025 年中国互联网使用率 | Spring 整合难度 | 大白话评价(真实声音) | 谁在用? |
|---|---|---|---|---|
| MyBatis | 90%+ | ★☆☆☆☆(超简单) | “老子就想写 SQL,别的别管我!” | 所有互联网公司、99% 新项目 |
| MyBatis-Plus | 80%+ | ★☆☆☆☆ | “MyBatis 的神级增强版,增删改查一行代码” | 所有想快死的创业公司、大厂业务系统 |
| Hibernate | < 3% | ★★★★☆ | “全自动 ORM,牛逼是牛逼,但 SQL 被它玩坏了” | 银行、传统企业、极少数老项目 |
| Spring Data JPA | ~8% | ★★☆☆☆ | “写 Java 代码就能操作数据库,爽但性能拉胯” | 国外项目、个人项目、快速原型 |
2025 年真实结论(直接背,面试必说)
- 新项目 99.9% 选 MyBatis-Plus + Spring Boot 3
- Hibernate 基本只存在于 10 年以上银行/政府老系统
- Spring Data JPA 国外用得多,国内大厂基本不用(SQL 不可控)
- 大厂核心系统:MyBatis(手写 SQL 极致性能)+ MyBatis-Plus(业务代码)
一、Spring Boot 3 整合 MyBatis-Plus(2025 王者,3 分钟上手)
# 1. pom.xml(只加一个依赖就行!)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.8</version>
</dependency>
// 2. 实体类
@TableName("t_user")
@Data
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
}
// 3. Mapper 接口(爽到飞起!)
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 继承 BaseMapper 后自动拥有 20+ 常用方法!
// 想自己写 SQL 也行:
@Select("SELECT * FROM t_user WHERE age > #{age}")
List<User> selectByAge(@Param("age") Integer age);
}
// 4. Service(一行代码增删改查)
@Service
@RequiredArgsConstructor
public class UserService {
private final UserMapper userMapper;
public void test() {
// 增删改查全自动
userMapper.insert(new User().setName("张三").setAge(18));
userMapper.selectById(1L);
userMapper.selectList(Wrappers.<User>lambdaQuery().gt(User::getAge, 20));
}
}
二、Spring Boot 3 整合原生 MyBatis(大厂核心系统标配)
@Mapper
public interface OrderMapper {
@Insert("INSERT INTO t_order(...) VALUES(...)")
@Options(useGeneratedKeys = true, keyProperty = "id")
Long insertOrder(Order order);
@Select("SELECT * FROM t_order WHERE user_id = #{userId}")
@Results({
@Result(column = "user_id", property = "userId"),
@Result(column = "create_time", property = "createTime")
})
List<Order> selectByUserId(Long userId);
}
三、Spring Boot 3 整合 Hibernate / JPA(了解即可,基本不用)
@Entity
@Table(name = "t_user")
@Data
public class User {
@Id @GeneratedValue
private Long id;
private String name;
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByAgeGreaterThan(Integer age);
}
四、2025 年大厂真实选型表(直接抄)
| 公司/场景 | 选型 | 原因 |
|---|---|---|
| 阿里、腾讯、字节、京东 | MyBatis + MyBatis-Plus | SQL 可控、性能极致、分库分表友好 |
| 创业公司 | MyBatis-Plus | 开发速度快 10 倍 |
| 银行/保险/政府 | Hibernate / JPA | 全自动 ORM,业务简单,SQL 不重要 |
| 高并发核心交易系统 | 纯 MyBatis(手写 SQL) | 性能到极致,SQL 优化空间最大 |
面试终极 6 连问 + 标准答案
- MyBatis 和 Hibernate 最大区别?
→ MyBatis 是“半自动”(自己写 SQL),Hibernate 是“全自动”(HQL → SQL),MyBatis 性能和可控性完胜。 - 为什么国内大厂不用 JPA?
→ SQL 完全不可控、分库分表不支持、N+1 查询问题、性能比 MyBatis 差 30~50%。 - MyBatis-Plus 有什么黑魔法?
→ 继承 BaseMapper 自动拥有 20+ CRUD 方法 + 代码生成器 + 逻辑删除 + 自动填充 + 分页插件。 - @Transactional 在 Mapper 接口方法上能用吗?
→ 不行!事务是 Spring AOP,只能作用于 public 的 Service 方法。 - 大厂为什么还手写 MyBatis XML?
→ 复杂联表、动态 SQL、分页、性能优化,手写 XML 最灵活。 - Spring Boot 怎么开启 MyBatis 驼峰映射?
→ 默认就开!application.yml 里:
mybatis:
configuration:
map-underscore-to-camel-case: true
终极记忆口诀(10秒背会)
“2025 记住了:
互联网看 MyBatis,创业看 Plus
银行看 Hibernate,国外看 JPA
大厂手写 SQL,性能它第一
增删改查一行,Plus 就是爹!”
背完这张表 + 口诀,
下次面试官问“Spring 怎么整合 MyBatis/Hibernate”,
你直接说:“国内 90% 用 MyBatis-Plus,Hibernate 基本绝迹”,
再甩出 BaseMapper 代码,
他当场就说:“这小伙子选型和实战都懂,收了!”
冲!大厂 40k+ 在等你!