先点进去看一下 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 是复位, 重置,
初始化的意思
来源: http://www.bubuko.com/infodetail-2503730.html