JDBC 是 Java 操作数据库的底层标准 API;MyBatis 是基于 JDBC 封装的持久层框架,底层依旧使用 JDBC。
1. 代码量大幅减少,消除重复样板代码
原生 JDBC 需要重复编写:加载驱动、创建连接、创建 Statement、设置参数、手动解析 ResultSet、关闭连接 / Statement/ResultSet,大量冗余模板代码。 MyBatis:连接、语句创建、资源关闭全部由框架自动管理,只需要写 SQL 和映射规则。
2. SQL 与 Java 代码解耦
JDBC:SQL 直接硬编码写在 Java 字符串里,改 SQL 就要改 Java 代码,需要重新编译,不方便 DBA 调优。
MyBatis:SQL 写在 XML 文件或注解中,SQL 和业务代码分离,修改 SQL 不用改 Java 代码;DBA 可以直接维护 SQL,便于 SQL 优化。

3. 自动结果集映射(ResultSet → Java 实体)
JDBC:需要手动
rs.getString("name")、rs.getInt("id")逐个取值,手动封装到 POJO,字段多时代码繁琐,容易写错列名。MyBatis:自动把查询结果映射到实体类,支持字段名和属性名不一致映射(
column/property)、嵌套对象、集合映射。
4. 参数绑定简化,防止 SQL 注入
JDBC:使用
PreparedStatement手动setInt(1,xxx),下标容易错位。MyBatis:使用
#{}预编译占位符,底层自动使用 PreparedStatement,天然防止 SQL 注入;参数直接传对象 / Map,不用按索引逐个设置。
注意
${}是字符串拼接,存在注入风险,仅用于动态表名等少数场景。
5. 强大的动态 SQL 能力
原生 JDBC 拼接动态查询条件(多条件模糊查询、可选参数)需要手写大量if拼接字符串,极易出错。 MyBatis 内置<if> <where> <choose> <foreach> <set>等标签,优雅拼接动态 SQL。
6. 支持缓存机制,提升查询性能
一级缓存(SqlSession 级别,默认开启):同一会话内相同查询直接走缓存,减少数据库访问。
二级缓存(Mapper 级别,可配置):跨会话共享缓存,适合读多写少场景。 原生 JDBC 没有内置缓存,需要自己实现。

7. 事务、连接池更好管理
原生 JDBC 需要手动控制事务commit/rollback,连接池需要自己集成。 MyBatis 可以和 Spring 无缝整合,由 Spring 管理事务、数据库连接池,声明式事务,开发简单。
8. 日志、分页、插件扩展
MyBatis 自带日志输出(打印 SQL、参数、返回结果),方便调试;支持插件机制(分页插件 PageHelper、加解密插件等)。原生 JDBC 要自己实现日志、分页。
劣势补充(客观对比)
MyBatis 是封装框架,底层还是 JDBC,有极微小的额外开销;超高并发极致性能场景原生 JDBC 会略优。
学习成本:需要熟悉 XML / 注解语法、映射规则。
半自动 ORM:只负责 SQL 结果映射,不像 Hibernate 全自动 ORM,SQL 仍然需要开发人员编写。
一句话总结
JDBC 是底层 API,重复代码多、SQL 硬编码、手动封装结果集;MyBatis 封装 JDBC,解耦 SQL、自动映射、动态 SQL、内置缓存,大幅提升开发效率。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢