Mybatis和hibernate到底有什么异同?

简介: 本文在这里给大家科普一下 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 框架,就像烹调一口好菜一样,有好的厨具和调料是基础,但手艺也非常重要。大家都是用菜刀,重要的是出菜的味道。

相关文章
|
6月前
|
SQL Java 数据库连接
hibernate和mybatis的区别
hibernate和mybatis的区别
|
SQL XML Java
mybatis基本构成&mybatis与hibernate的区别&添加mybatis支持
mybatis基本构成&mybatis与hibernate的区别&添加mybatis支持
|
3月前
|
SQL Java 数据库连接
MyBatis 和 Hibernate 有什么区别?
【8月更文挑战第21天】
53 0
|
4月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
68 0
|
6月前
|
SQL Java 数据库连接
MyBatis与Hibernate区别
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
|
6月前
|
SQL 存储 Java
MyBatis与Hibernate有什么区别?
MyBatis与Hibernate有什么区别?
42 1
|
11月前
|
SQL 缓存 Java
聊聊Hibernate和Mybatis的区别
聊聊Hibernate和Mybatis的区别
52 0
|
SQL Java 数据库连接
Java 最常见的面试题:mybatis 和 hibernate 的区别有哪些?
Java 最常见的面试题:mybatis 和 hibernate 的区别有哪些?
147 0
|
SQL 存储 IDE
MyBatis的相关配置、MyBatis与hibernate的区别
1.1 mybatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。 mybatis是一个基于Java的持久层框架(半自动),主要包括SQL Maps和Data Access Objects(DAO) ORM:Object Relational Mapping (对象与关系型数据库之间的映射管理框架) 1.2 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的