当前位置: 首页 > news >正文

MapperMethod中的SqlCommand和MethodSignature

一、SqlCommand的作用

职责:封装 SQL 命令的元信息。
关键属性:

name:Mapper 方法对应的 SQL 语句的唯一标识(通常是 命名空间.方法名,如 UserMapper.selectById)。
type:SQL 操作类型(SELECT, INSERT, UPDATE, DELETE, FLUSH等)。

来源:解析 Mapper 接口方法对应的 XML 或注解中的 SQL 定义。

二、MethodSignature的作用

职责:封装 Mapper 接口方法的签名信息。
关键属性:

returnType:方法返回类型(区分基本类型、集合、游标、Map 等)。
paramNameResolver:参数名解析器(处理 @Param注解、参数名映射)。
returnsVoid:方法是否返回 void。
returnsMany:是否返回集合(如 List)。
returnsMap:是否返回 Map。
returnsCursor:是否返回游标(Cursor)。

参数类型信息:用于动态 SQL 的参数绑定。

调用流程示例

假设有如下 Mapper 接口和 XML 配置

public interface UserMapper {User selectById(@Param("id") Long id, UserQuery query);
}
<!-- UserMapper.xml -->
<select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id} AND status = #{query.status}
</select>

步骤 1:初始化 MapperMethod

当首次调用 UserMapper.selectById()时,MyBatis 会创建 MapperMethod实例:
SqlCommand初始化:

name= "UserMapper.selectById"
type= SELECT(根据 XML 中的 <select>标签确定)

MethodSignature初始化:

returnType= User.class
paramNameResolver解析参数:
第一个参数 id被 @Param("id")注解 → 命名为 "id"
第二个参数 query无注解 → 命名为 "query"(或使用反射获取参数名)

步骤 2:方法调用触发执行

当调用 userMapper.selectById(100L, new UserQuery(“active”))时:

//内部会通过Invoke调用下面代码
MapperMethod.execute(sqlSession, args);

步骤 3:SqlCommand定位 SQL

通过 command.name找到对应的 SQL 语句(UserMapper.selectById)。
根据 command.type决定执行 sqlSession.select()/update()等方法。

步骤 4:MethodSignature处理参数

参数转换:
使用 paramNameResolver将方法参数转换为 SQL 参数 Map:

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", 100L);            // @Param("id") 映射
paramMap.put("query", userQuery);    // 参数名 "query" 映射参数绑定:
SQL 中的 #{id}→ 从 paramMap取 key="id"的值(100L)。
#{query.status}→ 从 paramMap取 key="query"的对象,再取其 status属性("active")。

步骤 5:执行 SQL 并处理结果

调用

sqlSession.selectOne(command.name, paramMap)

结果处理:

根据 MethodSignature.returnType决定返回值类型(此处为 User)。
若返回集合(如 List<User>),会调用 selectList并自动包装为集合。
http://www.dtcms.com/a/516595.html

相关文章:

  • 代码随想录Day55|108. 冗余连接、109. 冗余连接II
  • 最简单的方式做最系统的教学【计算机组成入门到入土】计组核心:一篇文章搞定指令格式与所有寻址方式
  • 30.redis消息队列
  • 如何做体育彩票网站什么是网络营销方案
  • 济南网站优化公司排名四川省建设工程交易中心网站
  • 企业安全防护之——防火墙
  • 电商网站制作公司网站单个页面紧张搜索引擎蜘蛛
  • mac 安装 dmg 格式程序,打开显示已损坏问题
  • CentOS 7 系统安装教程
  • 网站设计制作从哪里学起精准营销定义
  • Python 第二十一节 基础案例练习
  • 视频分析软件识别人像特征
  • Qt:Qt下载慢的解决方案
  • 南昌做公司网站哪家好做一款app需要多少钱费用
  • 怪兽网站模板网站运营谁都可以做吗
  • 金戈博爱联盟游资团队
  • 浏览器插件爬虫,原创,告别爬虫解密
  • 台式机网站建设福州搜索排名提升
  • 【开发指南】全志系列核心板开发过程中的常见问题及排查策略
  • 做搜狗pc网站优化哪些调查网站可以做问卷赚钱
  • 墙绘做网站哪家好长沙网红打卡景点
  • SignalR 底层原理详解
  • 企业应该如何进行网站推广济南建设大厦
  • Java面试题-两个对象相等equals相等吗,equals相等对象相等吗
  • 网站建设汇报材料链接买卖
  • 外贸型网站该如何推广甘肃网络公司网站
  • 外国做的福利小视频在线观看网站网站建设现状调查研究
  • DevEco Studio与Web联合开发:打造鸿蒙混合应用的全景指南
  • 动力网站网站关键词优化的步骤和过程
  • Kotlin 高阶函数在回调设计中的最佳实践