JDBC 与 MyBatis 的关系

230 阅读3分钟

JDBC(Java Database Connectivity)是 Java 提供的标准数据库操作 API,而 MyBatis 是一个基于 JDBC 的持久层框架。二者的关系可以总结为 “MyBatis 是 JDBC 的高级封装和扩展” 。以下是具体分析:


一、JDBC 的核心作用

JDBC 是 Java 连接数据库的底层基础,提供以下功能:

  1. 数据库连接管理:通过 DriverManagerDataSource 获取连接。
  2. SQL 执行:使用 StatementPreparedStatement 发送 SQL 到数据库。
  3. 结果集处理:通过 ResultSet 遍历查询结果。
  4. 事务控制:通过 Connectioncommit()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 的核心改进点

  1. 动态 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>
    
  2. 对象关系映射(ORM)

    • 自动将 ResultSet 转换为 Java 对象,支持复杂对象(如一对多、多对多)。
    <resultMap id="userWithOrdersMap" type="User">
        <collection property="orders" ofType="Order" column="id" select="selectOrdersByUserId"/>
    </resultMap>
    
  3. 缓存机制

    • 提供一级缓存(SqlSession 级别)和二级缓存(全局),减少数据库访问压力。
  4. 插件扩展

    • 允许通过拦截器(Interceptor)扩展功能(如分页、SQL 日志)。

四、JDBC 与 MyBatis 的对比

维度JDBCMyBatis
代码量冗余(需手动处理连接、结果集、资源释放)简洁(自动映射,资源管理)
灵活性高(直接控制 SQL 和执行细节)较高(支持动态 SQL,但需遵循框架约束)
学习成本低(API 简单)中(需学习 XML 配置、缓存机制等)
维护性低(SQL 硬编码在 Java 代码中)高(SQL 与代码分离,便于维护)
适用场景简单查询、底层优化需求复杂业务、需要快速开发和高可维护性

五、如何选择?

  1. 使用 JDBC 的场景

    • 需要极致性能优化(如高频简单查询)。
    • 对数据库操作有高度定制化需求。
    • 项目规模小,无需复杂 SQL 或 ORM 功能。
  2. 使用 MyBatis 的场景

    • 需要快速开发,减少重复代码。
    • 处理复杂 SQL 或动态查询条件。
    • 需要对象关系映射和缓存支持。

六、总结

  • JDBC 是 Java 操作数据库的基石,提供最基础的 API。
  • MyBatis 是 JDBC 的高级封装,通过配置化和自动化解决了 JDBC 的繁琐问题,提升开发效率。
  • 关系本质:MyBatis 底层依赖 JDBC 驱动与数据库交互,但通过框架设计隐藏了 JDBC 的复杂性。 类比:JDBC 是手动挡汽车,MyBatis 是自动挡汽车——后者更易驾驶,但前者更灵活。