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