是什么?
MyBatis是一款优秀的持久层框架,支持定制化SQL、存储过程以及高级映射。Mybatis消除了几乎所有的JDBC代码、手工设置参数以及获取结果集。Mybatis可以使用简单的XML或注解来配置和映射原生信息,
将接口和Java的POJOs(Plain Ordinary Java Objects,普通的Java对象)映射成数据库中的记录。
为什么?
ORM(Object Relational Mapping,对象关系映射)框架的实现,这样,开发者不需要再写繁琐的JDBC代码,也可以方便的处理数据库查询出来的结果集。
参考:
MyBatis的架构设计分析
MyBatis架构设计、执行流程等
Ibatis(MyBatis)框架之系统架构与映射原理
无论是 MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型,如枚举转换为int存储到数据库中,从数据库中取出int值转换为枚举。
详细:
MyBatis枚举映射数据库int存储转换
MyBatis支持一级缓存,二级缓存特性,先后顺序如下:
即本地缓存,永久缓存,Mybatis自行控制缓存的读写删,在执行器(BaseExecutor)中使用,执行器是在SqlSessionFactory.openSession()后创建的SqlSession中执行SQL语句时创建的,所以一级缓存的生命周期等同于SqlSession,也就是说是Session级的缓存。此缓存默认开启。
配置文件为:
//...
//...
实现 org.mybatis.cache.Cache 接口都可以作为MyBatis的二级缓存;二级缓存的Cache对象由Configuration进行管理,而 每次构建SqlSessionFactory对象时都会创建新的Configuration对象,因此,二级缓存的生命周期与SqlSessionFactory是相同的。基于Mapper XML 配置,在创建每个MapperedStatement对象时,都会根据其所属的namespace名称空间,给其分配Cache缓存实例。
如果要实现 mybatis 的二级缓存,一般来说有如下两种方式:
其中,内置方式实现,配置文件为:
mybatis-config.xml配置:
//...
//...
xxx.mapper.xml配置:
Mybatis的所有Cache算法都是基于装饰器模式对PerpetualCache扩展增加功能。
参考:
Mybatis一二级缓存区别
Mybatis一级缓存实现
MyBatis的Cache机制完全解析
Mybatis二级缓存源码
更多:
Mybatis四种分页方式
参考:
深入理解MyBatis(七)—MyBatis事务
Mybatis事务管理的两种方式
是什么?
JPA(Java Persistence API,Java持久化API),定义了对象-关系映射(ORM)以及实体对象持久化的标准接口。
为什么?
1、简化现有JavaEE和JavaSE应用的对象持久化的开发工作
2、Sun希望整合ORM技术,实现持久化领域的统一
怎么做?
1、ORM映射元数据-对象与表之间的关系
2、JPA的API-操作实体对象,执行CURD操作
3、查询语言-面向对象
JPA是需要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个。从功能上来说,JPA现在就是Hibernate功能的一个子集。JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现
参考:
JPA与Hibernate的关系
相同点:
1、基于ORM思想解决了对象与数据库表的映射问题
2、都是通过SessionFactoryBuider由XML配置文件生成SessionFactory,由SessionFactory 生成Session,由Session来开启执行事务和SQL(Structured Query Language,结构化查询语言)语句。
3、都支持JDBC(Java DataBase Connectivity,java数据库连接)和JTA(Java Transaction API,Java事务API(Application Programming Interface,应用程序编程接口))事务处理
不同点:
1、sql方面,mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易(hibernate因为更好的封装性,开发效率提高的同时,sql语句调优要更费力,当然可以手动修改sql来优化,但是同时也会影响开发效率);hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂
2、缓存方面,mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制
更多:
Mybatis与Hibernate对比
Mybatis不写Sql实现:
1、继承TKmybatis这个三方件中的Mapper/BaseMapper
2、实体类中进行JPA标注(@Entity、@Column、@Table等)
3、单表增删改查易行,多表关联查询待深入
TKmybatis重要思想:
1、通过SqlHelper.class,把代码转换成Mybatis需要的xml配置或内存模型等
2、执行Mybatis逻辑
3、通过SqlHelper工具类转换为目标xml,这个思想值得借鉴
MyBatis常见题目总结