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底层到底做了什么的更多相关文章
- sql查询过程中 update,insert,delete可视化收影响行数
insert into test_tb output inserted.id,inserted.data values('c'),('d') delete from test_tb output de ...
- insert和delete底层实现的方式
operator delete ()全局函数原型: /*operator delete: 该函数最终是通过free来释放空间的*/void operator delete(void *pUserDat ...
- 关于MyBatis mapper的insert, update, delete返回值
这里做了比较清晰的解释: http://mybatis.github.io/mybatis-3/java-api.html SqlSession As mentioned above, the Sql ...
- mybatis select/insert/update/delete
这里做了比较清晰的解释: http://mybatis.github.io/mybatis-3/java-api.html SqlSession As mentioned above, the Sql ...
- Mybatis的Mapper中的方法为什么不能重载?
目录 前言 环境配置 错误示范 为什么不能重载? 如何找到XML中对应的SQL? 总结 前言 在初入门Mybatis的时候可能都犯过一个错误,那就是在写Mapper接口的时候都重载过其中的方法,但是运 ...
- 后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用
mybatis pagehelper想必大家都耳熟能详了,是java后端用于做分页查询时一款非常好用的分页插件,同时也被人们称为mybatis三剑客之一,下面 就给大家讲讲如何在SSM项目和sprin ...
- SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别
SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...
- 使用intellij idea搭建MAVEN+SSM(Spring+SpringMVC+MyBatis)框架
基本概念 使用SSM(Spring,SpringMVC和Mybatis) 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod ...
- SSM+redis整合(mybatis整合redis做二级缓存)
SSM:是Spring+Struts+Mybatis ,另外还使用了PageHelper 前言: 这里主要是利用redis去做mybatis的二级缓存,mybaits映射文件中所有的select都会刷 ...
随机推荐
- 程序员的视角:java 线程
在我们开始谈线程之前,不得不提下进程. 无论进程还是线程都是很抽象的概念,有一个关于进程和线程很形象的比喻能帮我们更好的理解. 进程就像个房子,房子是一个包含了特定属性的容器,例如空间大小.卧室数量等 ...
- ServletRequest
/** * Defines an object to provide client request information to a servlet. The * servlet container ...
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- linux进程的介绍和管理
概述 - 在linux 中,每个执行的程序都称为一个进程,每一个进程都分配一个ID号 - 每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程,例如www服务器 - 每个进程都可 ...
- C#中任意类型数据转成JSON格式
/// <summary> /// List转成json /// </summary> /// <typeparam name="T&quo ...
- OpenCV 矩形轮廓检测
转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 基础介绍 OpenCV里提取目 ...
- #pragma comment(转)
此文转自微软MSDN.注意这是在Windows上才有的,Linux上可没有. #pragma comment( comment-type [,"commentstring"] ) ...
- Erlang cowboy 处理不规范的客户端
Erlang cowboy 处理不规范的客户端 Cowboy 1.0 参考 本章: Dealing with broken clients 存在许多HTTP协议的实现版本.许多广泛使用的客户端,如浏览 ...
- shell脚本里面相互调用时路径不要用pwd获取
shellA调用shellB,如果shellB 里面需要使用路径作为变量,去寻找其它文件.那么要注意,不用pwd,其返回的是系统中用户当前所在位置的路径,也就是shellA的路径,这样就错了.应该用d ...
- linux下创建且挂载光盘镜像
在linux下可以很方便的将多个文件,或多个文件夹下的内容打包进光盘镜像中,我们可以用: mkisofs -r -v -o xxx.iso /root /home 命令将/root以及/home目录下 ...