mybatis内置insert、update和delete

前面已经说过了怎么获取Connection,这次看下内置的insert和update是怎么实现的。

insert和update最后都会调用update(String statement, Object parameter)方法,如图1:

图1

Executor在DefaultSqlSession生成中已经说明过,默认生成的是CachingExecutor,在CachingExecutor中有个代理,如果不指定默认就是SimpleExecutor,如图2:

图2

那么就直接看下executor.update方法,这个是SimpleExecutor的父类BaseExecutor的方法,如图3:

图3

这里是一个模板方法,每个子类都实现了doUpdate方法,那么看下SimpleExecutor的doUpdate方法,如图4:

图4

这里能看到,通过Configuration会去实例化一个StatementHandler的实现类,如图5:

图5

那么再看下RoutingStatementHandler的构造函数,如图6:

图6

可以看到这里有三个StatementHandler的实现,是RoutingStatementHandler中的代理,默认是PreparedStatementHandler,在初始化解析的时候,如果不指定,那就是PreparedStatementHandler,如图7:

图7

那继续往下看,在初始化PreparedStatementHandler的时候是直接使用了父类的构造函数,如图8:

图8

可以看到主要是赋值一些参数,主要看下getBoundSql方法,如图9:

图9

这里就是解析sql的地方,关键还是要看sqlSource.getBoundSql方法,在这里还需要看初始化解析的时候,如果是静态sql,就是没有<if>和${},就会直接把#{}编译成?,然后返回一个RawSqlSource,但是其中内部有个sqlSource的属性,是StaticSqlSource类型,那StaticSqlSource就是预编译好以后的sql。如果是动态sql就回去解析<if>标签和使用OGNL表达式解析${},关于这块解析,我们下次在讨论。总之这里就是把sql解析了出来。

那么接下来就是获取连接,执行sql了,如图10:

图10

前面获取连接已经讲过了,直接看下是怎么执行update的吧,如图11:

图11

整个update和insert的过程就结束了。

那么下次我们来看下内置的select吧。

如果有不对请提出,共同提高,谢谢!!

原文地址:https://www.cnblogs.com/shenqiaqia/p/10472337.html

时间: 2024-08-12 12:08:57

mybatis内置insert、update和delete的相关文章

MyBatis XML 映射器 select、insert update 和 delete、参数

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在. 如果跟JDBC 代码进行对比,省掉了将近 95% 的代码. 1 selectCREATE TABLE person (id int(11) NOT NULL AUTO_INCREMENT,username varchar(100) DEFAULT NULL,password varchar(100) DEFAULT NULL,full_name varchar(100) DEFAULT NULL,first_name varchar

ORA-06547: INSERT, UPDATE 或 DELETE 语句必须使用 RETURNING 子句

产生这个错误的原因: returning into子句作用于insert,update,delete,上而select则不行,应该用into. 报错的存储如下: create or replace procedure p_stu_info(s_id number, s_name varchar2) is v_name varchar2(10); v_age number; v_ErrMsg varchar2(200); begin execute immediate 'select name,a

深入浅出Mybatis系列(七)---mapper映射文件配置之insert、update、delete[转]

上篇文章<深入浅出Mybatis系列(六)---objectFactory.plugins.mappers简介与配置>简单地给mybatis的配置画上了一个句号.那么从本篇文章开始,将会介绍mapper映射文件的配置, 这是mybatis的核心之一,一定要学好.在mapper文件中,以mapper作为根节点,其下面可以配置的元素节点有: select, insert, update, delete, cache, cache-ref, resultMap, sql . 本篇文章将简单介绍 in

mybatis insert、update 、delete默认返回值解释与如何设置返回表主键

在使用mybatis做持久层时,insert.update.delete,sql语句默认是不返回被操作记录主键的,而是返回被操作记录条数: 那么如果想要得到被操作记录的主键,可以通过下面的配置方式获取. 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle.DB2,可以采用如下配置方式: <insert id="save" parameterType="user"> <selectKey res

使用mybatis执行对应的SQL Mapper配置中的insert、update、delete等标签操作,数据库记录不变

我使用springMVC集成mybatis,执行SQLMapper配置文件里的insert操作,发现程序没有报错,但数据库表里却没有刚才插入的记录.查了很多资料,终于在一篇博客上找到了答案:在执行完方法后,必须有 session.commit();这句话进行事务提交.因为在做Insert  Update  Delete的时候,会先开启事务,而Mybatis不会自动提交(或许可以设置,我还不知道),所以,必须手动提交事务.于是我才调用包含insert操作的方法之后添加session.commit(

数据库--MyBatis的(insert,update,delete)三种批量操作

转自:http://blog.csdn.net/starywx/article/details/23268465 前段时间由于项目赶期没顾上开发过程中的性能问题,现对部分代码进行优化的过程中发现在数据量大的情况下对数据的操作反应似乎有些慢,就想到对数据库DML操作的时候进行批量操作.说道这里也想到自己在一次面试的时候别问道过批量操作数据的问题. 现对运用说明记录如下: 批量插入insert 方法一: <insert id="insertbatch" parameterType=&

mybatis insert update delete返回都是整型 0,1,增,删,改要提交事物

mybatis insert update delete返回都是整型 0,1, 没有扔 增,删,改要提交事物 原文地址:https://www.cnblogs.com/gzhbk/p/9499293.html

SQL Server下ADO.NET 怎么获取数据库SQL语句INSERT,UPDATE,DELETE了多少行数据

ADO.NET 在发送SQL语句到SQL Server数据库后,怎么知道真正INSERT,UPDATE,DELETE了多少行数据呢? 使用SQL Server内置的全局变量@@ROWCOUNT即可,@@ROWCOUNT可以返回在当前数据库连接(SqlConnection)中,执行的上一条SQL语句影响了多少行数据,使用示例如下所示: INSERT INTO [dbo].[Person]([PersonCode],[Name],[Age],[City]) VALUES (N'P8000',N'He

Update升级包中内置第三方app案例

Update升级包中内置第三方app案例 Update升级包中内置第三方app案例 介绍 总结内容 1 问题现象 2 原因分析 3 解决方案 Androidmk preinstallsh 4 后续工作中须注意细节 扩展阅读 1. 介绍 Amlogic MX8726 5iHome项目,客户提出需求在固件中预制第三方app 请列出开发的项目,项目简单背景,使用的平台,待总结的内容简述 2. 总结内容 2.1 问题现象: 客户提供第三方app直接使用U盘pm install YouKu_CIBN.ap