小撕Mybatis(三)

428 阅读2分钟

引言

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进行翻译,整合,达到互相对应的过程。

这是一种思想,也是一种方法,希望各位有所收获。