JDBC(Java Database Connectivity)是 Java 提供的标准数据库操作 API,而 MyBatis 是一个基于 JDBC 的持久层框架。二者的关系可以总结为 “MyBatis 是 JDBC 的高级封装和扩展” 。以下是具体分析:
一、JDBC 的核心作用
JDBC 是 Java 连接数据库的底层基础,提供以下功能:
- 数据库连接管理:通过
DriverManager或DataSource获取连接。 - SQL 执行:使用
Statement或PreparedStatement发送 SQL 到数据库。 - 结果集处理:通过
ResultSet遍历查询结果。 - 事务控制:通过
Connection的commit()和rollback()管理事务。
示例代码(原生 JDBC 查询) :
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM user");
while (rs.next()) {
String name = rs.getString("name");
// 手动处理结果...
}
rs.close();
stmt.close();
conn.close();
二、MyBatis 对 JDBC 的封装与优化
MyBatis 在 JDBC 基础上,通过以下方式简化开发:
| JDBC 的痛点 | MyBatis 的解决方案 |
|---|---|
| 手动管理连接和资源 | 自动管理连接池(如 POOLED 数据源) |
| 繁琐的结果集映射 | 通过 ResultMap 自动映射对象属性与数据库字段 |
| 硬编码 SQL 和参数处理 | 支持 XML/注解配置 SQL,动态 SQL 拼接 |
重复的 try-catch 代码 | 统一异常处理,无需手动关闭资源(如 SqlSession) |
| 事务管理复杂 | 提供声明式事务(如 Spring 集成) |
示例代码(MyBatis 查询) :
<!-- UserMapper.xml -->
<select id="selectUserById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
// Java 代码
User user = sqlSession.getMapper(UserMapper.class).selectUserById(1);
三、MyBatis 的核心改进点
-
动态 SQL 支持
- 通过
<if>,<foreach>等标签动态生成 SQL,避免手动拼接字符串。
<select id="findUsers" resultType="User"> SELECT * FROM user <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age = #{age}</if> </where> </select> - 通过
-
对象关系映射(ORM)
- 自动将
ResultSet转换为 Java 对象,支持复杂对象(如一对多、多对多)。
<resultMap id="userWithOrdersMap" type="User"> <collection property="orders" ofType="Order" column="id" select="selectOrdersByUserId"/> </resultMap> - 自动将
-
缓存机制
- 提供一级缓存(
SqlSession级别)和二级缓存(全局),减少数据库访问压力。
- 提供一级缓存(
-
插件扩展
- 允许通过拦截器(
Interceptor)扩展功能(如分页、SQL 日志)。
- 允许通过拦截器(
四、JDBC 与 MyBatis 的对比
| 维度 | JDBC | MyBatis |
|---|---|---|
| 代码量 | 冗余(需手动处理连接、结果集、资源释放) | 简洁(自动映射,资源管理) |
| 灵活性 | 高(直接控制 SQL 和执行细节) | 较高(支持动态 SQL,但需遵循框架约束) |
| 学习成本 | 低(API 简单) | 中(需学习 XML 配置、缓存机制等) |
| 维护性 | 低(SQL 硬编码在 Java 代码中) | 高(SQL 与代码分离,便于维护) |
| 适用场景 | 简单查询、底层优化需求 | 复杂业务、需要快速开发和高可维护性 |
五、如何选择?
-
使用 JDBC 的场景:
- 需要极致性能优化(如高频简单查询)。
- 对数据库操作有高度定制化需求。
- 项目规模小,无需复杂 SQL 或 ORM 功能。
-
使用 MyBatis 的场景:
- 需要快速开发,减少重复代码。
- 处理复杂 SQL 或动态查询条件。
- 需要对象关系映射和缓存支持。
六、总结
- JDBC 是 Java 操作数据库的基石,提供最基础的 API。
- MyBatis 是 JDBC 的高级封装,通过配置化和自动化解决了 JDBC 的繁琐问题,提升开发效率。
- 关系本质:MyBatis 底层依赖 JDBC 驱动与数据库交互,但通过框架设计隐藏了 JDBC 的复杂性。 类比:JDBC 是手动挡汽车,MyBatis 是自动挡汽车——后者更易驾驶,但前者更灵活。