Mybatis3源码分析(13)-Sql解析执行-BoundSql的加载-2

本文主要探讨Mybatis3中Sql的解析执行,重点关注BoundSql的生成过程。在SqlNode.apply()之后,虽然初步处理了"${}",但"#{}"的处理和参数映射尚未完成。通过分析DynamicSqlSource.getBoundSql()和ParameterMappingTokenHandler的工作原理,揭示Mybatis如何处理这两种占位符,以实现动态SQL和参数绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面分析到SqlNode.apply()后,Sql还是个半成品。只处理了"${}"这种占位符,"#{}"这种占位符还没有处理,而且Sql执行时的参数也没有生成。

再来看DynamicSqlSource.getBoundSql()方法

   public BoundSql getBoundSql(Object parameterObject) {
    DynamicContext context = new DynamicContext(configuration, parameterObject);
    //这里只处理了"${}"占位符
    rootSqlNode.apply(context);
    SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);
    Class<?> parameterType = parameterObject == null ? Object.class : parameterObject.getClass();
    //这里就是处理"#{}"占位符的地方
    SqlSource sqlSource = sqlSourceParser.parse(context.getSql(), parameterType, context.getBindings());
    //这个BoundSql就是数据库可执行的Sql,同时还包含了运行时的参数。
    BoundSql boundSql = sqlSource.getBoundSql(parameterObject);
    for (Map.Entry<String, Object> entry : context.getBindings().entrySet()) {
      boundSql.setAdditionalParameter(entry.getKey(), entry.getValue());
    }
    return boundSql;
  }

sqlSourcePar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值