MyBatis 参数传递与结果映射(7.24)

一、 入参传递机制(Java -> SQL)

SQL 中的 #{} 本质是 OGNL 表达式,用于从传入的参数中获取值。

(1)单对象参数

  • 底层机制:当只有一个参数且不加 @Param 时,MyBatis 不会将其封装进 Map,而是直接将传入的 Java 对象本身作为唯一的参数源。
  • 解析过程:当 XML 解析到 #{status} 时,MyBatis 直接通过 OGNL 表达式调用该对象的 getStatus() 方法获取值。
  • SQL 写法:直接写 #{属性名}(如 #{status})。

(2)加了 @Param 注解的情况

  • 底层机制:MyBatis 会强制将参数封装进一个 Map 中,@Param 的值即为 Map 的 Key。
  • 解析过程:当 XML 解析到 #{audit.status} 时,MyBatis 必须先通过 Key(audit)从 Map 中取出对象,再通过 OGNL 调用 getStatus() 方法。
  • SQL 写法:必须先写 Key,再点出属性。例如:#{audit.status}

(3)多参数情况

  • 底层机制:多个参数时,MyBatis 默认将它们封装进 Map(Key 默认为 arg0, param1 等)。
  • 规范:必须加 @Param 注解指定有意义的 Key,否则 SQL 中无法通过业务名称取值。

二、 结果映射机制(SQL -> Java)

SQL 执行后返回结果集,需通过 resultTyperesultMap 将数据库字段映射回 Java 对象。

(1)parameterType 属性

  • 在 MyBatis 3.x 及若依框架中,该属性通常可省略。MyBatis 能够自动推断传入的 Java 对象类型。

(2)resultType(自动映射)

  • 机制:MyBatis 自动将查询结果的列名与 Java 对象的属性名进行匹配。
  • 要求:数据库字段名必须与 Java 属性名完全一致,或者开启了驼峰命名自动映射(mapUnderscoreToCamelCase: true),否则属性将无法赋值。

(3)resultMap(自定义映射)

  • 机制:手动定义数据库字段与 Java 属性的对应关系。
  • 优势:当数据库字段名(如 user_name)与 Java 属性名(如 userName)不一致,或涉及一对多、多对一的复杂嵌套查询时,必须使用 resultMap

三、 整体数据流向总结

(1)增删改

  • 流向:前端 -> 后端 Java 对象 -> SQL #{属性名} -> 数据库字段
  • 返回:后端直接返回受影响的行数(int
  • 底层细节:
    • MyBatis 底层中,insert、delete 操作最终都会被统一路由到 update 方法中执行。
    • 执行增删改操作前,框架会自动清空当前一级缓存,避免缓存数据过期,保证后续查询数据最新。
    • 插入自增主键数据时,可通过配置 useGeneratedKeys="true",自动将数据库生成的自增主键回填到传入的 Java 对象属性中。

(2)查询

  • 入参流向:前端 -> 后端 Java 对象(VO/实体类) -> SQL #{属性名} 执行查询
  • 出参流向:数据库结果集 -> resultType / resultMap 映射 -> 封装成 Java 对象 -> 返回给前端
  • 底层细节:
    • 缓存拦截机制:SQL 执行前优先走缓存,顺序为 一级缓存 -> 二级缓存,缓存命中则直接返回结果,无需查询数据库。
    • SQL执行链路(缓存未命中):由 StatementHandler 创建并预编译 SQL,ParameterHandler 结合 OGNL 表达式,将 Java 对象属性填充至 SQL 占位符,最终通过 JDBC 执行 SQL。
    • 结果封装机制:通过 ResultSetHandler 结合 TypeHandler 类型处理器,完成数据库字段类型到 Java 数据类型的自动转换,最终通过反射封装为 Java 对象返回。
posted on 2026-07-24 19:15  冬冬咚  阅读(13)  评论(0)    收藏  举报