当前位置: 首页 > 原理解释

mybatis的运行原理-MyBatis 运行原理

想象你正在对着一个庞大的、没有窗户的仓库大门喊话,想叫里面的东西出来。
要是你的喊话声不是通过喊叫,而是通过一只铁链,你就要把铁链的另一头扣在仓库的门把手上,然后用力拽,门才会打开。 这就是 MyBatis 在数据库驱动里的真身。咱们平时搜“数据库驱动”,脑海里蹦出来的多是 JDBC,要么啥 ODBC、ADO 这些名字。但在 MyBatis 的世界,它们更像是在仓库门口放了一只铁链。MyBatis 就是那个握住铁链的手。 HTTP 协议像是一条胶带,把前端和后端死死粘在一起,哪位都不能动,只能写字。SQL 语言就像是一把锯,你得拿着锯子,自己在锯道上移动,才能把木头(数据)锯下来。而 MyBatis 呢?它把锯子留在了锯道上,手里只攥着一条丝带。它把你的 SQL 写死在代码里(就像把锯子固定在锯道上),然后调用由它自己管理的驱动(就像手腕子),只要略微动动手指头,数据就出来了。 在 Java 编写的数据库驱动里,就像是你自己在仓库门口晃悠,还得自己招架那些乱七八糟的“破坏分子”。你能往里扔 SQL,还能往里扔事务代码,就连还能往里扔 Java 对象。每一次你往里扔东西,都得自己管自己,还要自己面对那些非预期的垃圾。 但在 MyBatis 里,你就变成了那个拿着丝带的手。你只管把 SQL 写进去,不管多复杂,只要是合理的结构,它就能帮你处理。它不关心你扔了啥,它只负责把里面的东西塞进仓库。 这就好比你有两个仓库大门。一个是 JDBC 大门,另一个是 MyBatis 大门。
要是你只用 JDBC,你得自己扛着那根铁链,还要自己看门。
要是你只用 MyBatis,你得自己写文档,要么写一堆复杂的注释,否则没人敢进。而 MyBatis 的妙处就在于,它把那些原本要写在文档里、要么要写注释里的东西,直接给写在了 SQL 语句里(就像把锯子焊死在锯道上)。 比如在写订单的时候,你用 JDBC 的话,你得自己写一个 `Transaction` 对象,然后自己调用 `commit()` 要么 `rollback()`。
这时候你可能想再加个“要是黄了记得反悔”的逻辑,那你还得自己加个软性的 `try-catch`。结局呢?代码变长了,逻辑也乱了。目前你用 MyBatis,你写一行 SQL,``,把条件写进去,代码变得简洁多了。
那“要是黄了记得反悔”的逻辑,不是你得加注释,而是你得直接把 `rollback()` 写进 SQL 里,要么写成一个 `@Transactional` 注解在方式里,让 MyBatis 自己去管。 这种“写 SQL 而不是写驱动代码”的方式,简直就是为了解决大家那个“数据库驱动”忒费劲的难题。 咱们拿一个具体的例子来说。假设你要查一下用户信息,与此同时还得判断这个用户是不是有权限访问。 你要是用 JDBC,得写一个对象 `UserList`,里面存一堆东西,每行一个。
然后你得自己写代码去循环,要么自己写代码去拼接字符串,去判断这个用户是不是有权限。
要是你写错了,还得自己管。
这时候代码可能像这样: ```java // 你自己写的“驱动逻辑” List users = new ArrayList<>(); // 循环查数据 // 你自己写判断权限的逻辑 if (user.getRole().equals("admin")) { users.add(user); } else { users.add(null); } // 你自己处理异常 try { // 你的代码逻辑 } catch (Exception e) { // 你自己处理 } ``` 这玩意儿如何看如何像是一个在硬扛的劳动者。 目前换成 MyBatis。你只需求写一句 SQL,就像一个指令卡: ```sql ``` 这里面,`role` 是你刚刚判断权限的地方,直接写在了 SQL 里。MyBatis 跑完这段 SQL,就会自动把查出来的实体组装成 `User` 的对象,然后给你回 `List`。 你要是想加了个“不存有的权限”功能?只需求改行,加个 ``: ```sql ``` 要么换个“不存有的逻辑”?比如你想查所有数据?改个数字即可。 这种“写 SQL 而不是写驱动代码”的哲学,就像是你把自己从那个需求自己扛着铁链的仓库门口解放了出来。你不再是那个在仓库门口乱晃的人,你就是那个拿着丝带的手,只管把商品(数据)放进去,至于这些商品能不能进,能不能拿,那是门(驱动)的事,不是你的事。 正出于如此,MyBatis 能变得如此强大。出于它把那些原本要写在文档里的、要么要写注释里的东西,直接给写在了 SQL 语句里。
要是 SQL 写错了,程序直接崩溃,你连个逻辑都没退出来,直接凉了。
这简直就是一条铁律,哪位都不能绕。 并且,它还能帮你搞定那些“要是黄了记得反悔”的逻辑。
比如你想查一个带权限的用户信息,但又得保证要是数据库挂了,记得要把所有已经查出来的数据都删掉。 要是是 JDBC,你得自己写一个 `Transaction` 对象,里面写一堆 `if` 判断,你自己去写 `commit()` 要么 `rollback()`。
这时候你可能想再加个“要是黄了记得反悔”的逻辑,那你还得自己加个软性的 `try-catch`。结局呢?代码变长了,逻辑也乱了。 目前换成 MyBatis,你只需求写一行 SQL,``,把条件写进去,代码变得简洁多了。
那“要是黄了记得反悔”的逻辑,不是你得加注释,而是你得直接把 `rollback()` 写进 SQL 里,要么写成一个 `@Transactional` 注解在方式里,让 MyBatis 自己去管。 这种“写 SQL 而不是写驱动代码”的方式,简直就是为了解决大家那个“数据库驱动”忒费劲的难题。 咱们拿一个具体的例子来说。假设你要查一下用户信息,与此同时还得判断这个用户是不是有权限访问。 你要是用 JDBC,得写一个对象 `UserList`,里面存一堆东西,每行一个。
然后你得自己写代码去循环,要么自己写代码去拼接字符串,去判断这个用户是不是有权限。
要是你写错了,还得自己管。
这时候代码可能像这样: ```java // 你自己写的“驱动逻辑” List users = new ArrayList<>(); // 循环查数据 // 你自己写判断权限的逻辑 if (user.getRole().equals("admin")) { users.add(user); } else { users.add(null); } // 你自己处理异常 try { // 你的代码逻辑 } catch (Exception e) { // 你自己处理 } ``` 这玩意儿如何看如何像是一个在硬扛的劳动者。 目前换成 MyBatis。你只需求写一句 SQL,就像一个指令卡: ```sql ``` 这里面,`role` 是你刚刚判断权限的地方,直接写在了 SQL 里。MyBatis 跑完这段 SQL,就会自动把查出来的实体组装成 `User` 的对象,然后给你回 `List`。 你要是想加了个“不存有的权限”功能?只需求改行,加个 ``: ```sql ``` 要么换个“不存有的逻辑”?比如你想查所有数据?改个数字即可。 这种“写 SQL 而不是写驱动代码”的哲学,就像是你把自己从那个需求自己扛着铁链的仓库门口解放了出来。你不再是那个在仓库门口乱晃的人,你就是那个拿着丝带的手,只管把商品(数据)放进去,至于这些商品能不能进,能不能拿,那是门(驱动)的事,不是你的事。 正出于如此,MyBatis 能变得如此强大。出于它把那些原本要写在文档里的、要么要写注释里的东西,直接给写在了 SQL 语句里。
要是 SQL 写错了,程序直接崩溃,你连个逻辑都没退出来,直接凉了。
这简直就是一条铁律,哪位都不能绕。 并且,它还能帮你搞定那些“要是黄了记得反悔”的逻辑。
比如你想查一个带权限的用户信息,但又得保证要是数据库挂了,记得要把所有已经查出来的数据都删掉。 要是是 JDBC,你得自己写一个 `Transaction` 对象,里面写一堆 `if` 判断,你自己去写 `commit()` 要么 `rollback()`。
这时候你可能想再加个“要是黄了记得反悔”的逻辑,那你还得自己加个软性的 `try-catch`。结局呢?代码变长了,逻辑也乱了。 目前换成 MyBatis,你只需求写一行 SQL,``,把条件写进去,代码变得简洁多了。
那“要是黄了记得反悔”的逻辑,不是你得加注释,而是你得直接把 `rollback()` 写进 SQL 里,要么写成一个 `@Transactional` 注解在方式里,让 MyBatis 自己去管。 这种“写 SQL 而不是写驱动代码”的方式,简直就是为了解决大家那个“数据库驱动”忒费劲的难题。 就像你站在仓库门口,手里攥着那根铁链,还得自己看门。
要是你只用 MyBatis,你就变成那个拿着丝带的手,只管把商品放进去,至于商品能不能进,那是门的事。 故此别再去纠结能不能用驱动代码,也别再去想驱动代码有多复杂。你就是那个拿着丝带的手,只管把 SQL 写进去,剩下的交给它。 这就是 MyBatis 的奥义所在,好办、直接、有力。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站