MyBatis 被称为半自动 ORM(Object-Relational Mapping)工具,是因为它在对象和数据库表之间的映射过程中,需要开发者手动编写 SQL 语句。
🌟 MyBatis 的特点
- MyBatis 需要开发者定义 SQL 语句(如
SELECT,INSERT,UPDATE,DELETE)。 - 开发者需要在映射文件(Mapper)或注解中手动配置 SQL 语句与对象字段之间的映射关系。
- MyBatis 负责将查询结果映射到 Java 对象,或将 Java 对象的属性值绑定到 SQL 语句的参数中。
🔸 示例:MyBatis 半自动 ORM
👉 数据库表 user 结构如下:
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);
👉 定义 Java 对象 User.java
public class User {
private int id;
private String name;
private int age;
// Getters and Setters
}
👉 定义 MyBatis 的 Mapper 接口和 XML 映射文件
UserMapper.java
@Mapper
public interface UserMapper {
@Select("SELECT user_id, user_name, user_age FROM user WHERE user_id = #{id}")
@Results({
@Result(column = "user_id", property = "id"),
@Result(column = "user_name", property = "name"),
@Result(column = "user_age", property = "age")
})
User getUserById(int id);
}
或者使用 XML 文件定义 SQL:
<mapper namespace="com.example.mapper.UserMapper">
<!-- 定义 resultMap 映射 -->
<resultMap id="UserResultMap" type="com.example.model.User">
<result column="user_id" property="id"/>
<result column="user_name" property="name"/>
<result column="user_age" property="age"/>
</resultMap>
<!-- 定义查询,并引用 resultMap -->
<select id="getUserById" resultMap="UserResultMap">
SELECT user_id, user_name, user_age FROM user WHERE user_id = #{id}
</select>
</mapper>
👉 在服务中调用:
User user = userMapper.getUserById(1);
System.out.println(user.getName());
✅ MyBatis 是半自动的原因:
- SQL 需要手写:MyBatis 不会自动生成 SQL 语句,开发者需要自己编写。
- 映射手动配置:需要手动指定 SQL 语句与 Java 对象字段之间的映射。
- 查询和对象转换是 MyBatis 自动完成的:MyBatis 负责在执行 SQL 后将结果集映射到 Java 对象中。
🌟 全自动 ORM 的特点(如 Hibernate)
全自动 ORM(如 Hibernate)不需要开发者手动编写 SQL 语句,而是通过定义对象和表之间的映射,自动生成 SQL 语句并执行。
🔸 示例:Hibernate 全自动 ORM
👉 定义 Java 对象(加上 Hibernate 的注解):
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "name")
private String name;
@Column(name = "age")
private int age;
}
👉 使用 Hibernate 直接查询(不需要写 SQL):
Session session = sessionFactory.openSession();
User user = session.get(User.class, 1);
System.out.println(user.getName());
✅ Hibernate 是全自动的原因:
- 不需要手动写 SQL,Hibernate 自动生成 SQL。
- 通过注解(或 XML 配置)完成对象与表之间的映射。
- Hibernate 负责自动创建、查询、更新和删除记录。
🆚 MyBatis(半自动) vs. Hibernate(全自动)
| 特性 | MyBatis(半自动 ORM) | Hibernate(全自动 ORM) |
|---|---|---|
| SQL 编写 | 需要开发者手动编写 | 自动生成 |
| 对象映射 | 手动配置 | 自动配置(通过注解或 XML) |
| 灵活性 | 更灵活(可以优化 SQL) | 不灵活(但易用) |
| 学习成本 | SQL 基础 + 配置 | 需要理解 ORM 机制 |
| 事务管理 | 手动管理(通过 Spring 或 MyBatis 配置) | 自动管理(通过 Hibernate) |
| 性能优化 | 手动优化 SQL | 需要通过 Hibernate 提供的配置进行优化 |
🏆 总结
- MyBatis 适合对 SQL 语句有精细控制,或对查询性能有严格要求的场景。
- Hibernate 适合开发效率优先,快速开发的场景。
- MyBatis 的“半自动”体现在需要开发者手写 SQL,而 Hibernate 的“全自动”体现在它会自动生成 SQL。