MyBatis 与 JDBC 的关系?
MyBatis 与 JDBC 存在密切的关系,可以理解为:MyBatis 是对 JDBC 的封装和增强,但并没有完全取代 JDBC。
1. JDBC (Java Database Connectivity):
- 底层 API: JDBC 是 Java 访问数据库的底层 API,它提供了一套标准的接口和类,用于连接各种关系型数据库(MySQL、Oracle、PostgreSQL 等)。
- 手动操作: 使用 JDBC,开发者需要手动编写大量的代码来完成以下操作:
- 加载数据库驱动。
- 建立数据库连接(
Connection
)。 - 创建
Statement
或PreparedStatement
对象。 - 编写 SQL 语句。
- 设置参数(使用
PreparedStatement
)。 - 执行 SQL 语句。
- 处理结果集(
ResultSet
)。 - 处理异常。
- 关闭连接、
Statement
和ResultSet
。
- 代码繁琐: JDBC 的代码非常繁琐,容易出错,而且可读性和可维护性较差。 大量的代码需要重复编写。
- SQL 注入风险: 如果直接使用
Statement
拼接 SQL 语句,容易导致 SQL 注入漏洞。
2. MyBatis:
- ORM 框架 (Object-Relational Mapping): MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的操作。 MyBatis 可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通 Java 对象)为数据库中的记录。
- 简化 JDBC 操作: MyBatis 在底层仍然使用 JDBC 来访问数据库,但它封装了 JDBC 的复杂性,提供了更简洁、更易用的 API。
- SQL 与 Java 代码分离: MyBatis 将 SQL 语句从 Java 代码中分离出来,放在 XML 映射文件或注解中,提高了代码的可读性和可维护性。
- 参数映射: MyBatis 使用
#{}
占位符来绑定参数,自动进行参数类型转换,并使用PreparedStatement
来执行 SQL 语句,有效防止了 SQL 注入漏洞。 - 结果集映射: MyBatis 可以自动将查询结果集映射为 Java 对象或 Map,无需手动处理
ResultSet
。 - 动态 SQL: MyBatis 提供了强大的动态 SQL 功能,可以根据条件灵活地生成 SQL 语句。
- 缓存机制: MyBatis 提供了一级缓存和二级缓存,可以提高查询性能。
MyBatis 与 JDBC 的关系总结:
- MyBatis 基于 JDBC: MyBatis 的底层实现仍然依赖于 JDBC。 MyBatis 并没有重新发明一套数据库访问机制,而是对 JDBC 进行了封装和抽象。
- MyBatis 简化了 JDBC: MyBatis 解决了 JDBC 代码繁琐、容易出错、可维护性差等问题,提供了更简洁、更易用的 API。
- MyBatis 不是 JDBC 的替代品: MyBatis 并不能完全取代 JDBC。在某些特殊场景下,例如需要对数据库连接进行非常精细的控制,或者需要使用 JDBC 的某些特定功能时,仍然可以直接使用 JDBC。
- 可以混合使用: 在实际项目中,可以根据需求混合使用 MyBatis 和 JDBC。对于大部分的数据库操作,使用 MyBatis 可以大大提高开发效率;对于一些特殊的、需要底层控制的场景,可以使用 JDBC。
下面是一个形象的比喻:
可以将 JDBC 比作手动挡汽车,MyBatis 比作自动挡汽车。
- 手动挡 (JDBC): 驾驶员需要手动控制离合器、换挡杆等,对汽车的控制更直接、更精细,但也更复杂、更费力。
- 自动挡 (MyBatis): 驾驶员只需要控制油门和刹车,汽车会自动换挡,驾驶更简单、更轻松,但对汽车的控制不如手动挡那么直接。
大多数情况下,自动挡汽车(MyBatis)更适合日常驾驶,但在某些特殊情况下,例如赛车或越野,手动挡汽车(JDBC)可能更合适。
总而言之,MyBatis 是对 JDBC 的一种高级封装,它简化了数据库访问的复杂性,提高了开发效率,同时保持了与底层 JDBC 的兼容性。