mybatis就是一个orm框架,jpa封装的太狠了,导致程序员想要优化sql都没地方入手。从而知道,应该把sql抽离框架,交由程序员管理。
而至于其他的管理事务,获取连接,提交事务这些东西,都是些 模板,所以可以交于框架管理。
而sql就抽离出为一个xml,利用标签来动态拼接sql。调用的话,利用接口与对应的xml来对应。获取对应的代理类,类似aop的功能来执行sql。
但是如果 每次从配置类拿的话,又麻烦,那直接就交给spring来。
获取SqlsessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
可以从中看出,sqlsessionfactory是通过读取配置类,从而构建对应的SqlSessionFactory。我们从源码可以看出,
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { SqlSessionFactory var5; try { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); var5 = this.build(parser.parse()); } catch (Exception var14) { throw ExceptionFactory.wrapException("Error building SqlSession.", var14); } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException var13) { } } return var5; } public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
是通过xml读取配置解析得到Configuration从而构建SqlSessionFactory。
获取Session可以看出,开启sqlsession是通过执行器,而执行器又是关联事务。那么我们就知道,每个事务既是会话,而会话即是由事务决定。同一个事务用同一个会话,一个会话同一个连接。
获取mapper代理类可以看出,通过sqlsession获取的是mapperProxy代理类,而代理类拦截了方法。object方法放行,而其他方法都拦截执行。
mapper方法执行可以看出,执行的时候,是通过mappermethod,而这里又进行了参数解析convertArgsToSqlCommandParam(将方法参数改为mapper,有@param改为key是@param,没有就param加上index)
而具体执行,通过sqlsession,而sqlsession是通过
executor来执行的。通过方法名获取对应的mapperstatement(方法接口的具体一个方法)。
而执行又委派给了statementhandler。
可以看出,这里就是简单的jdbc的statement执行了。
插件原理可以看出,这个插件就是把对象包一层,是不是就是代理。其实就是通过代理,从而偷梁换柱。
这里有四大对象。executor,statementHandler,parameterHandler和resultHandler对象
见名知义,执行器,每个方法的执行处理器,参数处理器,结果处理器。
通过代理,从而达到插件的效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)