- hibernate是Table与对象的映射,适合于面向对象开发,实体清晰时适合使用;mybatis是sql与对象的映射,统计查询时适合使用。
- hibernate主要是配置实体关系,查询实体;mybatis主要是写sql;
- Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。
- Hibernate 自动生成sql,有些语句较为繁琐,不易查错,会多消耗一些性能;Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;
2. hibernate和mybatis缓存?
- (相同)都分为两级缓存,一级缓存和二级缓存;一级缓存都是session事务级别的,在一个事务中有效,事务执行完后缓存失效
- hibernate的二级缓存时应用进程级别的(SessionFactory范围内的缓存,所有的Session共享一个二级缓存),整个应用进程查询相同的sql时会使用二级缓存中的数据;
- Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。
- mybatis二级缓存是以namespace(一个mapper文件)为单位的缓存,可以让多个sqlSession共享,但不是应用程序级别
- mybatis二级缓存,在多个namespace中对同一个表有更新操作时会出现脏数据,造成查询错误。
3. hibernate
- 3.1 get和load的区别?
- get会先查一级缓存,在查二级缓存,然后查数据库;load会先查一级缓存,如果没找到,就创建代理对象,等需要的时候去查询二级缓存和数据库
- get是立即加载,load是延时加载
- get如果没有找到会返回null,load如果没有找到会抛出异常