首页 > 其他分享 >mybatis SelectKey标签执行原理

mybatis SelectKey标签执行原理

时间:2022-11-29 10:47:36浏览次数:54  
标签:executor mappedStatement 标签 parameterObject SelectKey sql mybatis boundSql 执行

SelectKey标签在mybatis中可以配置成在主sql执行之前和执行之后两种时机进行执行。

mybatis执行sql时一次会涉及到这些对象

sqlSession-->Executor-->StatementHandler

其中selectKey的处理就是在StatementHandler中进行的

一、在主sql执行之前执行

BaseStatementHandler的构造方法中会检查是否需要处理selectKey的执行,这就是在主sql执行之前执行

protected BaseStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    this.configuration = mappedStatement.getConfiguration();
    this.executor = executor;
    this.mappedStatement = mappedStatement;
    this.rowBounds = rowBounds;

    this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();
    this.objectFactory = configuration.getObjectFactory();

    if (boundSql == null) { 
      //这块就是在处理主sql之前执行selectKey
      generateKeys(parameterObject);
      boundSql = mappedStatement.getBoundSql(parameterObject);
    }

    this.boundSql = boundSql;

    this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);
    this.resultSetHandler = configuration.newResultSetHandler(executor, mappedStatement, rowBounds, parameterHandler, resultHandler, boundSql);
  }

protected void generateKeys(Object parameter) {
    KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
    ErrorContext.instance().store();
    //这块是具体的方法,keyGenerator是一个接口,当使用selectKey标签时,对应的实现类是
    // SelectKeyGenerator
    keyGenerator.processBefore(executor, mappedStatement, null, parameter);
    ErrorContext.instance().recall();
  }

二、在主sql执行之后执行

StatementHandler是一个接口,BaseStatementHandler是一个公共实现类,具体的数据库处理逻辑是在其子类中实现的。我们以PreparedStatementHandler举例,insert语句最终会通过statementHandler中的 update方法来执行

public int update(Statement statement) throws SQLException {
    PreparedStatement ps = (PreparedStatement) statement;
    //这里是用PreparedStatement执行sql语句
    ps.execute();
    int rows = ps.getUpdateCount();
    Object parameterObject = boundSql.getParameterObject();
    KeyGenerator keyGenerator = mappedStatement.getKeyGenerator();
    // 这里就是在处理主sql之后执行selectKey标签
    keyGenerator.processAfter(executor, mappedStatement, ps, parameterObject);
    return rows;
}

标签:executor,mappedStatement,标签,parameterObject,SelectKey,sql,mybatis,boundSql,执行
From: https://www.cnblogs.com/chengxuxiaoyuan/p/16934677.html

相关文章

  • meta标签几个常用方法!
     <!--设置页面编码格式,中文问题--><metahttp-equiv="Content-Type"content="text/html;charset="utf-8"/><!--强制文档宽度与设备宽度保持1:1,且文档最大宽度比例......
  • 强调文本的标签
    标签描述​<em>​呈现为被强调的文本。​<strong>​定义重要的文本。​<dfn>​定义一个定义项目。​<code>​定义计算机代码文本。​<samp>​定义样......
  • html标签汇总及使用
    font标签color属性修改颜色face属性修改字体size属性修改字体大小<fontcolor="blue"size="5"face="宋体">字体</font> 常用的特殊字符怎么表示......
  • 电子商务企业如何利用数据标签
    准确的搜索结果和个性化推荐无疑是现代电子商务的基石。随着全球越来越多的企业迁移到网上,每家这样的公司的目标都很简单——帮助用户快速轻松地找到他们想要的东西,以便在......
  • 009.MyBatis数据插入操作
    1.数据库事务  2.新增  3.实现步骤3.1goods.xml 在插入的时候没有插入主键是因为主键设置成了自增字段,<selectKey>的作用是进行主键回填<insertid="ins......
  • JSP中的自定义标签
    目录​​目录​​​​简介​​​​入门案例​​​​自定义标签功能扩展​​​​传统自定义标签的运行原理​​​传统自定义标签的使用​​​控制JSP页面部分内容执行​​​......
  • springboot+mysql+mybatis逆向工程
     最近一直再做hibernate相关的工作,想捡起遗忘了一年的mybatis,就在自己的demo项目中引入了一下,记录下过程,这里只生成mapper和model和mapper.xml一、引入依赖  ......
  • Swift基础之init方法,实例(对象)方法,类(静态)方法的使用(多标签Demo)
    Xcode更新过后,有些方法都进行了改变,Demo中有变化的都进行了简单的标记,具体以后遇见再说创建一个UIView类,用init方法创建两种类型,显示多标签,创建静态方法进行调用,创建类方法......
  • iOS开发之字数不一的多标签Demo
    有朋友让帮他写一个封装的字数不一的多标签视图,所以今天将代码展示一下,供大家学习代码中封装了两种方法,分别是:1.传递数组,数组中是NSString类型的方法;2.传递数组,数组中是NSDi......
  • mybatis快速xml技巧
    1.查询2.条件查询参数传递[封装]方式三种......