mirror of
				https://github.com/zhwei820/learn.lianglianglee.com.git
				synced 2025-11-04 08:13:45 +08:00 
			
		
		
		
	fix img
This commit is contained in:
		@@ -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>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user