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 执行后返回结果集,需通过 resultType 或 resultMap 将数据库字段映射回 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)
评论()
收藏
举报