SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底层到底做了什么

Posted 晨曦Dawn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底层到底做了什么相关的知识,希望对你有一定的参考价值。

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

先点进去看一下insert方法

用ctrl加鼠标左键点进去看

  发现是一个接口SqlSession的方法,没有实现 ,但是通过里氏替换原则的想法,他是接口接收了实现类,所以找他的实现类DefaultSqlSession(idea快捷键ctrl+H)

  进去后用ctrl+F查找insert,可以看到多个insert方法构成的重载,但是他们的方法实现调用了这个

 

public int insert(String statement) {
        return this.insert(statement, (Object)null);
    }

    public int insert(String statement, Object parameter) {
        return this.update(statement, parameter);
    }

 

  上面那个方法调用了下面的方法,下面insert方法确实调用了update方法

再看一下delete的方法,

  他和insert类似,都是接口SqlSession的方法,所以还是找他的实现类DefalutSqlSession

  进去之后继续寻找delete方法

 

public int delete(String statement) {
        return this.update(statement, (Object)null);
}

public int delete(String statement, Object parameter) {
        return this.update(statement, parameter);
}

 

  可以看出他也是调用了update方法,所以就引发了好奇,update带俩个参数的那个方法中有什么?为什么都调用它呢?

看一下update方法

 

public int update(String statement, Object parameter) {
        int var4;
        try {
            this.dirty = true;
            MappedStatement e = this.configuration.getMappedStatement(statement);
            var4 = this.executor.update(e, this.wrapCollection(parameter));
        } catch (Exception var8) {
            throw ExceptionFactory.wrapException("Error updating database.  Cause: " + var8, var8);
        } finally {
            ErrorContext.instance().reset();
        }

        return var4;
    }

 

  这里简单的提一下,

    1)dirty=true;代表了他已经成为脏数据,意思就是内存上的数据和数据库中不一致,为什么这儿会改,或许就要谈论到为什么增删改需要手动提交事务(session.commit())和

      session.close为什么会造成事物的回滚,可能下几章博客会有简单刨析一下

    2)MappedStatement这个我找了一些资料,但是从百度搜索的没有告诉明白这个是什么东西,简单的说一下,如果错误,请大家帮我指出来,它应该是获取到mybatis配置中的具体SQL

    3)var4就是用执行器执行sql,接收返回值,由update返回值是int,并且是var4,可以推断出他应该是返回受影响的行数

    4)ErrorContext从字面意思理解为错误的上下文,instance是实例的意思,他源码是通过静态方法,拿到ErrorContext对象实例或创建实例并返回回来,单例的写法,reset是复位,重置,

    初始化的意思

 

以上是关于SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底层到底做了什么的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 入门

Mybatis

mybatis执行过程及经典面试题

mybatis

03-Mybatis 核心组件

初识MyBatis框架