为什么说 MyBatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

129 阅读3分钟

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 是半自动的原因:

  1. SQL 需要手写:MyBatis 不会自动生成 SQL 语句,开发者需要自己编写。
  2. 映射手动配置:需要手动指定 SQL 语句与 Java 对象字段之间的映射。
  3. 查询和对象转换是 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 是全自动的原因:

  1. 不需要手动写 SQL,Hibernate 自动生成 SQL。
  2. 通过注解(或 XML 配置)完成对象与表之间的映射。
  3. 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。