本文在这里给大家科普一下 MyBatis 和 Hibernate,看它们有哪些异同。

SQL 处理方式

首先,我们来看一下它们的 SQL 处理方式。MyBatis 采用 SQL 映射文件的方式,像调料一样,开发人员需要提供 SQL 语句和变量,自己动手丰衣足食;而 Hibernate 则采用了 ORM 的方式,像下锅菜一样,直接将 Java 对象转化为 SQL 执行。 首先是 MyBatis 的代码片段,可以看到使用 MyBatis 时需要手动处理 SQL 语句:

public interface StudentDao {
    @Select("SELECT * FROM student WHERE id = #{id}")
    Student findById(@Param("id") long id);
}

而 Hibernate 则是基于 JPA 注解的实现,很多 SQL 操作都是自动生成的:

@Entity
@Table(name = "student")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private int age;
}

hibernate执行sql操作:

@Service
@Transactional
public class StudentServiceImpl implements StudentService {

    private StudentDao studentDao;

    @Autowired
    public void setStudentDao(StudentDao studentDao) {
        this.studentDao = studentDao;
    }

    @Override
    public Student findById(long id) {
        return studentDao.findById(id).orElse(null);
    }

    @Override
    public void save(Student student) {
        studentDao.save(student);
    }

    @Override
    public List<Student> findAll() {
        return (List<Student>) studentDao.findAll();
    }

    // ...
}

缓存

接着我们说说缓存,MyBatis 采用了基于二级缓存的机制,让 SQL 语句在内存中执行,Hibernate 的先进缓存机制则更加强大,可以瞬间提升系统响应速度。

缓存方面,MyBatis 可以手动选择开启一级和二级缓存:

<cache eviction="LRU" flushInterval="10000" size="1024"/>

而 Hibernate 则有更多的缓存选项,包括二级缓存和查询缓存:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property>

再来看数据访问方式,MyBatis 的数据访问是基于 DAO 实现的,开发者需要手动实现和维护 DAO 接口,像剁菜一样,自己把 DAO 接口处理好;Hibernate 则是基于 JPA 规范实现的,使用注解标记实体类,就像自己动手做大餐,不需要太多耐心和精力。

在数据访问方面,MyBatis 和 Hibernate 则是采用了不同的方式。MyBatis 的数据访问是基于 DAO 实现的,需要手动实现 DAO 接口:

public interface StudentMapper {
    Student selectById(Long id);
}

而 Hibernate 则是直接注解在实体类上,不需要显式地定义 DAO 接口。

映射方式

我们说说它们的映射方式。MyBatis SQL 映射文件需要手动指定每个数据库字段,没有默认值,跟自己下厨房一样自定义;Hibernate 通常情况下会根据对象属性映射到数据库列上,如果没有指定,则使用注解或配置文件里定义的默认值,像自动送餐上门一样会帮你省去很多工作。

看一下映射方式,这是一个 MyBatis 的 SQL 映射文件:

<select id="findById" parameterType="long" resultMap="studentResultMap">
    SELECT * FROM student WHERE id = #{id}
</select>

而 Hibernate 则是根据对象属性映射到数据库中的列上,一般不需要再处理:

@Entity
@Table(name = "student")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private int age;
}

以上就是一些简单的代码片段,说明了 MyBatis 和 Hibernate 几个不同的点,相信大家通过这些例子,更能理解两者之间的区别,选择合适的 ORM 框架。

总结

MyBatis 和 Hibernate 在使用上各有优点,需要根据实际项目需求来选择最合适的 ORM 框架,就像烹调一口好菜一样,有好的厨具和调料是基础,但手艺也非常重要。大家都是用菜刀,重要的是出菜的味道。