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底层到底做了什么的主要内容,如果未能解决你的问题,请参考以下文章