当前位置: 首页 > news >正文

MyBatis 与 JDBC 的关系?

MyBatis 与 JDBC 存在密切的关系,可以理解为:MyBatis 是对 JDBC 的封装和增强,但并没有完全取代 JDBC。

1. JDBC (Java Database Connectivity):

  • 底层 API: JDBC 是 Java 访问数据库的底层 API,它提供了一套标准的接口和类,用于连接各种关系型数据库(MySQL、Oracle、PostgreSQL 等)。
  • 手动操作: 使用 JDBC,开发者需要手动编写大量的代码来完成以下操作:
    • 加载数据库驱动。
    • 建立数据库连接(Connection)。
    • 创建 StatementPreparedStatement 对象。
    • 编写 SQL 语句。
    • 设置参数(使用 PreparedStatement)。
    • 执行 SQL 语句。
    • 处理结果集(ResultSet)。
    • 处理异常。
    • 关闭连接、StatementResultSet
  • 代码繁琐: 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 的兼容性。

相关文章:

  • 【记录一下】Hierarchical Navigable Small Worlds(HNSW)是什么玩意?
  • VS2022远程调试树莓派上的.net core程序
  • C语言经典案例-菜鸟经典案例
  • C++编写Redis客户端
  • BOOK推荐-学海无涯
  • 大模型工程师学习日记(十五):Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析)
  • Linux基础网络设置
  • 尚硅谷爬虫note15n
  • day18-后端Web开发——Maven高级
  • NewStar CTF week3 web wp
  • 玩转python:掌握Python数据结构之栈Stack
  • SPI学习笔记
  • 数电笔记——第二章 逻辑代数基础(二)
  • seacmsv9报错注入管理员密码+orderby+limit
  • Django下防御Race Condition
  • 【时间序列】因果推断:从时序数据中探寻“因”与“果”
  • GStreamer —— 2.9、Windows下Qt加载GStreamer库后运行 - “教程9:媒体信息收集“(附:完整源码)
  • WebSocket(WS)协议系列(四)SSL/TLS协议
  • flask学习3-深入
  • ConcurrentHashMap底层原理
  • 优普南通网站建设/收录查询工具
  • 用固定ip做访问网站服务器/seo刷点击软件
  • 一家专门做衣服的网站/百度关键词seo外包
  • 低价网站建设教程/怎么自己建网站
  • 《网站建设》项目实训报告/企业品牌营销推广
  • 淘宝做图片的网站/网站制作推广电话