在这个方法设置断点: org.apache.ibatis.scripting.defaults.DefaultParameterHandler#setParameters
for循环后可以看到?被替换后的结果,上面截图用的HikariCP
Druid估计差不多,DefaultParameterHandler 这个类持有Druid的引用,找下PS对象的属性应该就可以找到
DefaultParameterHandler 是 MyBatis 的实现类
它属于 MyBatis 核心模块,负责 将 Java 参数绑定到 SQL 语句(即 PreparedStatement 的参数设置)。
它不直接处理数据库差异,而是 通过 JDBC 标准接口 调用数据库驱动。
它内部调用的是 JDBC 标准接口(如 PreparedStatement.setXxx())
例如:
java
ps.setInt(1, 100); // 调用 JDBC 标准方法
ps.setString(2, "hello"); // 调用 JDBC 标准方法
不同的数据库驱动(如 MySQL、PostgreSQL)会实现这些 JDBC 接口,因此 MyBatis 无需关心底层是哪种数据库。
Mybatis,连接池,JDBC驱动,数据库调用关系参考:
MyBatis (DefaultParameterHandler)
↓ 调用 setParameter()
Druid (PreparedStatementProxyImpl) → 代理增强(监控、拦截等)
↓ 调用底层 JDBC 接口
真正的 JDBC 驱动(如 MySQL 的 ClientPreparedStatement)
↓ 最终操作数据库
Database (MySQL/PostgreSQL/Oracle...)