引言
Mybtais是一种ORM框架,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
本文我将从三个步骤进行Mybatis解读。
Mybatis如何操作的
进入openSession()中调用的openSessionFromDataSource()
final Environment environment = configuration.getEnvironment();
获取数据源
然后生成一个执行器(事务包含在执行器里)
final Executor executor = configuration.newExecutor(tx, execType);
此时有个问题了,总共有哪几种执行器
public enum ExecutorType {
//默认 ExecutorType.SIMPLE
//这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。
//ExecutorType.REUSE
//这个执行器类型会复用预处理语句。
//ExecutorType.BATCH
//这个执行器会批量执行所有更新语句,如果SELECT在它们中间执行还会标定它们是必须的,来保证一个简单并易于理解的行为。
SIMPLE, REUSE, BATCH
}
又有一个问题,Mybatis的一级缓存默认开启还是关闭
//默认启用缓存
protected boolean cacheEnabled = true;
//如果要求缓存,生成另一种CachingExecutor(默认就是有缓存),装饰者模式,所以默认都是返回CachingExecutor
if (cacheEnabled) {
executor = new CachingExecutor(executor);
}
答案显而易见
下一个问题,缓存怎么用?
这个问题待会回答。
接下来我们开始使用执行器来查询结果
return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
在进入query()方法之后,sql语句也发生了变化
之前:
之后:
作用:
预编译,防止sql注入
之后就是调用JBDC的操作了。(PreparedStatement、ResultSet)
回到之前的问题,缓存怎么用?
首先Mybatis会生成一个key,(生成采取规则为:[mappedStementId + offset + limit + SQL + queryParams + environment]生成一个哈希码。),然后putObject进去,等到下次查询时先查看有无缓存key(getObject),没有则到数据库进行查询。
总结
根据我一开始描述,什么是ORM框架,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
左边JAVA类型,右边数据库类型,通过Mybatis进行翻译,整合,达到互相对应的过程。
这是一种思想,也是一种方法,希望各位有所收获。