博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis Insert、update、delete流程
阅读量:4992 次
发布时间:2019-06-12

本文共 3717 字,大约阅读时间需要 12 分钟。

上文mybatis源码简书我们讲到sqlsession中通过executor来执行sql,我们接着往下看

update方法点进去,我们进到baseexecutor

这里我们看到 clearLocalCache 方法,可见每次更新都会清除缓存

我们再看到doUpdate

1 public int doUpdate(MappedStatement ms, Object parameter) throws SQLException { 2     Statement stmt = null; 3     try { 4       Configuration configuration = ms.getConfiguration(); 5       StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null); 6       stmt = prepareStatement(handler, ms.getStatementLog()); 7       return handler.update(stmt); 8     } finally { 9       closeStatement(stmt);10     }11   }

先看第5行,生成一个 StatementHandler,StatementHandler是mybatis4大对象之一,负责处理Mybatis与JDBC之间Statement的交互。

我们再看下newStatementHandler,

这里又看 RoutingStatementHandler,先不管,再点进去,会发现会有不同类型的StatementHandler

SimpleStatementHandler,这个很简单了,就是对应我们JDBC中常用的Statement接口,用于简单SQL的处理;PreparedStatementHandler,这个对应JDBC中的PreparedStatement,预编译SQL的接口;CallableStatementHandler,这个对应JDBC中CallableStatement,用于执行存储过程相关的接口;RoutingStatementHandler,这个接口是以上三个接口的路由,没有实际操作,只是负责上面三个StatementHandler的创建及调用。

 

这几个StatementHandler他有共同的构造器,都在BaseStatementHandler

1 protected BaseStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { 2     this.configuration = mappedStatement.getConfiguration(); 3     this.executor = executor; 4     this.mappedStatement = mappedStatement; 5     this.rowBounds = rowBounds; 6  7     this.typeHandlerRegistry = configuration.getTypeHandlerRegistry(); 8     this.objectFactory = configuration.getObjectFactory(); 9 10     if (boundSql == null) { // issue #435, get the key before calculating the statement11       generateKeys(parameterObject);12       boundSql = mappedStatement.getBoundSql(parameterObject);13     }14 15     this.boundSql = boundSql;16 17     this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);18     this.resultSetHandler = configuration.newResultSetHandler(executor, mappedStatement, rowBounds, parameterHandler, resultHandler, boundSql);19   }

这里顺便创建了parameterHandler和 resultSetHandler

parameterHandler的作用就是进行参数预编译设置,resultSetHandler封装我们得到的结果。

public int doUpdate(MappedStatement ms, Object parameter) throws SQLException { 2     Statement stmt = null; 3     try { 4       Configuration configuration = ms.getConfiguration(); 5       StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null); 6       stmt = prepareStatement(handler, ms.getStatementLog()); 7       return handler.update(stmt); 8     } finally { 9       closeStatement(stmt);10     }11   }

再看第六行,我们在生成StatementHandler,开始执行prepareStatement

1 private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {2     Statement stmt;3     Connection connection = getConnection(statementLog);4     //调用StatementHandler.prepare5     stmt = handler.prepare(connection);6     //调用StatementHandler.parameterize7     handler.parameterize(stmt);8     return stmt;9   }

我们看到prepare方法,生成statement,用过jdbc的都知道,Statement对象主要用于将 SQL 语句发送到数据库中,执行对数据库的数据的检索或者更新

 

生成好statement后,我们再看下第7行

public int doUpdate(MappedStatement ms, Object parameter) throws SQLException { 2     Statement stmt = null; 3     try { 4       Configuration configuration = ms.getConfiguration(); 5       StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null); 6       stmt = prepareStatement(handler, ms.getStatementLog()); 7       return handler.update(stmt); 8     } finally { 9       closeStatement(stmt);10     }11   }

 这里就是真正的执行sql的地方。

 

转载于:https://www.cnblogs.com/xmzJava/p/8777082.html

你可能感兴趣的文章
记java应用linux服务单个CPU使用率100%分析
查看>>
将文件字节输出流写入到文本中
查看>>
Linux编程之给你的程序开后门
查看>>
Ubuntu下Hadoop的安装和配置
查看>>
VS2010中生成遇到的 web.config 问题
查看>>
Nginx安装部署(反向代理与负载均衡)
查看>>
2018年最新小程序一键智能生成平台限时限量销售!
查看>>
集合遍历过程iterator, 添加删除元素报异常
查看>>
echarts一些笔记
查看>>
最长上升子序列
查看>>
Java-面向对象
查看>>
salesforce 零基础学习(四十四)实现checkbox列表简单过滤功能
查看>>
Android 异步下载
查看>>
c# 中 利用 CookieContainer 对 Cookie 进行序列化和反序列化校验
查看>>
Leetcode 743. Closest Leaf in a Binary Tree
查看>>
如何用Java实现反转排序
查看>>
Leetcode-911 Online Election(在线选举)
查看>>
自己动手写字符串库函数 一(C语言实现) 分类: C语言学习 ...
查看>>
说说接口封装
查看>>
Linux Supervisor的安装与使用入门---SuSE
查看>>