mapper的个人理解

mybaits的个人理解

mybatis就是一个orm框架,jpa封装的太狠了,导致程序员想要优化sql都没地方入手。从而知道,应该把sql抽离框架,交由程序员管理。

而至于其他的管理事务,获取连接,提交事务这些东西,都是些 模板,所以可以交于框架管理。

而sql就抽离出为一个xml,利用标签来动态拼接sql。调用的话,利用接口与对应的xml来对应。获取对应的代理类,类似aop的功能来执行sql。

但是如果 每次从配置类拿的话,又麻烦,那直接就交给spring来。

获取SqlsessionFactory

SqlSessionFactory 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值