由于种种原因,最近开发项目使用的持久层框架由springdatajpa 更换为 mybatis ,但是一直不知道mybatis 到底好在哪里,与朋友也一直就两种持久层技术哪种更好争执不休
JPA默认使用hibernate作为ORM实现,所以,一般使用Spring Data JPA即会使用hibernate。我们再看看hibernate的官方概念,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
从框架的设计理念上来看,hibernate是一种面向对象,全自动的orm框架,hibernate 是我们不用关注数据库,而需要去关注代码本身,通过操作映射表的实体对象,一定程度上简化了开发,提高了开发效率,而mybatis 是一种半自动的orm框架,使用时需要自己写sql语句,在我看来,项目中太多的sql语句,反而不如直接的实体对象操作更清晰明了
从表关联上看,有人说hibernate的多表关联是一大弊病,hibernate 本身并没有提供实体类多表关联的方法,而如果通过mangtoOne之类的实体类设计又会产生效率问题,但其实现在已经有了很好的解决方案,通过整合queryDSL就可以很方便地对表对象进行关联查询,这样其实mybatis 的灵活sql优势其实也没有那么的明显
从表,表字段映射上看,hibernate 直接通过框架生成表,表字段,能够更方便地对数据库的表进行维护,而mybatis 建表更新表都需要写sql语句,又需要花费精力去维护这样的sql语句,sql语句查询出来的数据又要通过resultMap 进行映射,没有hibernate方便
从性能上看,如果只是内部系统,用户量较小的系统,两个框架其实性能上差距不会太明显,这个时候推荐使用springdatajpa 开发效率反而会更高,但是如果是互联网项目,app接口之类的项目,为了追求极致的性能,还是我觉的就应该对两个框架的利弊进行取舍了