mybatis的parameterhandler通过parametermapping解析、typehandler类型转换和preparedstatement安全赋值三步联动实现参数绑定:#{ }走预编译路径,经反射取值、类型适配后调用setxxx防注入;${ }为字符串拼接,不参与parametermapping和typehandler处理,无类型安全且易引发sql注入。

MyBatis 的 ParameterHandler 把 Java 方法参数正确设置到 SQL 占位符,核心在于“解析映射 + 类型适配 + 安全赋值”三步联动,不是简单地按顺序填值,而是依赖 BoundSql 中的 ParameterMapping 清单和 TypeHandler 的精准协作。
#{} 占位符:走预编译安全路径
当 SQL 中使用 #{id} 这类写法时,MyBatis 在解析阶段就将其转为 ?,并生成对应的 ParameterMapping 对象(含属性名、Java 类型、TypeHandler 等信息)。ParameterHandler.setParameters() 执行时:
- 遍历
BoundSql.getParameterMappings()得到每个占位符的映射描述 - 调用
getParameterValue(parameterMapping, parameterObject)从原始参数中提取值——若参数是 POJO,就通过反射读取id字段;若是 Map,就按 key 查找;若是单值(如int),则直接作为值 - 根据
ParameterMapping指定或自动匹配的TypeHandler,将 Java 值转为 JDBC 兼容类型(例如String→VARCHAR,LocalDateTime→TIMESTAMP) - 调用
PreparedStatement.setXxx(index, value)安全设参,完全规避 SQL 注入
${} 占位符:字符串拼接,不经过 ParameterHandler 绑定
${tableName} 这类写法在 SQL 解析阶段(即生成 BoundSql 之前)就被替换成实际字符串,属于动态 SQL 的文本替换环节。它不会出现在 ParameterMapping 列表里,因此 ParameterHandler.setParameters() 根本不会处理它——它早已固化在最终 SQL 字符串中。这意味着:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 没有类型转换,不走
TypeHandler - 无法防注入,必须由开发者确保传入值可信(比如白名单校验)
- 不能用于 where 条件值、insert values 等需类型安全的场景
参数对象结构决定取值逻辑
ParameterHandler 不关心你传的是单个 int、一个 User 对象,还是 Map<string object></string>,它统一通过 parameterObject 和 ParameterMapping.getProperty() 协同工作:
- 单值参数(如
selectUserById(int id)):getProperty()返回"id"或空字符串,getParameterValue直接返回该整数 - POJO 参数(如
updateUser(User user)):getProperty()是字段名(如"name"),通过反射获取对应属性值 - Map 参数(如
selectByMap(Map params)):getProperty()作为 key 从 Map 中取值 - 注解指定(
@Param("uid") int id):MyBatis 将其包装为ParamMap,key 为"uid",getProperty()匹配该 key
TypeHandler 是类型转换的关键桥梁
没有 TypeHandler,ParameterHandler 就无法把 java.time.LocalDate 正确塞进 DATE 类型的数据库字段。它的作用体现在:
- MyBatis 启动时注册常用类型处理器(如
IntegerTypeHandler、StringTypeHandler) - 每个
ParameterMapping可显式指定typeHandler,否则按 Java 类型自动查找 - 自定义类型(如枚举、JSON 字符串)需注册对应
TypeHandler,否则会抛异常或存错格式 - 设置参数时,
TypeHandler.setParameter(ps, i, value, jdbcType)被调用,完成最终 JDBC 层赋值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










