This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -186,7 +186,7 @@ function hide_canvas() {
<p>默认情况下,<strong>我们在使用 MyBatis 的时候用的都是 DefaultSqlSession 这个默认的 SqlSession 实现</strong>。DefaultSqlSession 中维护了一个 Executor 对象通过它来完成数据库操作以及事务管理。DefaultSqlSession 在选择使用哪种 Executor 实现的时候使用到了策略模式DefaultSqlSession 扮演了策略模式中的 StrategyUser 角色Executor 接口扮演的是 Strategy 角色Executor 接口的不同实现则对应 StrategyImpl 的角色。</p>
<p>另外DefaultSqlSession 还维护了一个 dirty 字段来标识缓存中是否有脏数据,它在执行 update() 方法修改数据时会被设置为 true并在后续参与事务控制决定当前事务是否需要提交或回滚。</p>
<p>下面接着来看 DefaultSqlSession 对 SqlSession 接口的实现。DefaultSqlSession 为每一类数据操作方法提供了多个重载,尤其是 select*() 操作,而且这些 select*() 方法的重载之间有相互依赖的关系,如下图所示:</p>
<p><img src="assets/Cgp9HWBYb-iAKkKeAADz5INxXLw311.png" alt="Drawing 2.png" /></p>
<p><img src="assets/Cgp9HWBYb-iAKkKeAADz5INxXLw311.png" alt="png" /></p>
<p>select() 方法之间的调用关系</p>
<p>通过上图我们可以清晰地看到,所有 select*() 方法最终都是通过调用 Executor.query() 方法执行 select 语句、完成数据查询操作的,之所以有不同的 select*() 重载,主要是对结果对象的需求不同。例如,我们使用 selectList() 重载时,希望返回的结果对象是一个 List集合使用 selectMap() 重载时,希望查询到的结果集被转换成 Map 类型集合返回至于select() 重载,则会由 ResultHandler 来处理结果对象。</p>
<p>DefaultSqlSession 中的 insert()、update()、delete() 等修改数据的方法以及 commit()、rollback() 等事务管理的方法同样也有多个重载它们最终也是委托到Executor 中的同名方法,完成数据修改操作以及事务管理操作的。</p>