Java進階之光!mysql創建用戶并授權建表

正文

MyBatis 的整體架構分為三層, 分別是基礎支持層核心處理層接口層,如下圖所示。

基礎支持層

反射模塊

該模塊對 Java 原生的反射進行了良好的封裝,提供了更加簡潔易用的 API ,方便上層使調用,并且對反射操作進行了一系列優化,例如緩存了類的元數據,提高了反射操作的性能。

類型轉換模塊

類型轉換模塊提供了兩個主要功能,一個功能是別名機制,MyBatis 為了簡化配置文件提供了別名機制;另一個功能是實現 JDBC 類型與 Java 類型之間的轉換,該功能在為 SQL 語句綁定實參以及映射查詢結果集時都會涉及。

日志模塊

提供詳細的日志輸出信息,并且能夠集成多種日志框架,其日志模塊的一個主要功能就是集成第三方日志框架。

資源加載模塊

資源加載模塊主要是對類加載器進行封裝,確定類加載器的使用順序,并提供了加載類文件以及其他資源文件的功能。

解析器模塊

解析器模塊主要提供兩個功能,一個功能是對 XPath 進行封裝,為 MyBatis 初始化時解析 mybatis-config.xml 配置文件以及映射配置文件提供支持;另一個功能是為處理動態 SQL 語句中的占位符提供支持。

數據源模塊

MyBatis 自身提供了相應的數據源實現,也提供了與第三方數據源集成的接口。

事務管理

MyBatis 對數據庫中的事務進行了抽象,其自身提供了相應的事務接口和簡單實現。一般在應用中,MyBatis 會與 Spring 框架集成,并由 Spring 框架管理事務。

緩存模塊

MyBatis 中提供了一級緩存和二級緩存,而這兩級緩存都是依賴于基礎支持層中的緩存模塊實現的。MyBatis 中自帶的這兩級緩存與 MyBatis ?以及整個應用是運行在同一個 JVM 中的,共享同一塊堆內存。如果這兩級緩存中的數據量較大, 則可能影響系統中其他功能的運行,所以當需要緩存大量數據時,優先考慮使用 Redis 、Memcache 等緩存產品。

Binding 模塊

在調用 SqlSession 相應方法執行數據庫操作時,需要指定映射文件中定義的 SQL 節點,如果出現拼寫錯誤,我們只能在運行時才能發現相應的異常。為了盡早發現這種錯誤,MyBatis 通過 Binding 模塊將用戶自定義的 Mapper 接口與映射配置文件關聯起來,系統可以通過調用自定義 Mapper 接口中的方法執行相應的SQL 語句完成數據庫操作,從而避免上述問題。

需要注意的是,開發人員無須編寫自定義 Mapper 接口的實現,MyBatis 會自動為其創建動態代理對象。

核心處理層

在核心處理層中實現了 MyBatis 的核心處理流程,其中包括 MyBatis 的初始化以及完成一次數據庫操作涉及的全部流程。

配置解析

在 MyBatis 初始化過程中,會加載 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息會形成相應的對象并保存到 Configuration 對象中。之后,利用該 Configuration 對象創建 SqlSessionFactory 對象。待 MyBatis 初始化之后,開發人員可以通過初始化得到 SqlSessionFactory 創建 SqlSession 對象并完成數據庫操作。

SOL 解析與 scripting 模塊

拼湊 SQL 語句是一件煩瑣且易出錯的過程,為了將開發人員從這項枯燥無趣的工作中解脫出來,MyBatis 實現動態 SQL 語句的功能,提供了多種動態 SQL 語句對應的節點,例如, 節點、 節點、 節點等。通過這些節點的組合使用,開發人員可以寫出幾乎滿足所有需求的動態 SQL 語句。

MyBatis 中的 scripting 模塊會根據用戶傳入的實參,解析映射文件中定義的動態 SQL 節點,并形成數據庫可執行的 SQL 語句。之后會處理 SQL 語句中的占位符,綁定用戶傳入的實參。

SQL?執行

SQL 語句的執行涉及多個組件,其中比較重要的是 Executor 、StatementHandler 、ParameterHandler 和 ResultSetHandler。Executor 主要負責維護一級緩存和二級緩存,并提供事務管理的相關操作,它會將數據庫相關操作委托給 StatementHandler 完成。StatementHandler 首先通過 ParameterHandler 完成 SQL 語句的實參綁定;然后通過 java.sql.Statement 對象執行 SQL 語句并得到結果集;最后通過 ResultSetHandler 完成結果集的映射,得到結果對象并返回。

插件

用戶可以通過添加自定義插件的方式對 MyBatis 進行擴展。用戶自定義插件也可以改變 MyBatis 的默認行為,例如,我們可以攔截 SQL 語句并對其進行重寫。由于用戶自定義插件會影響 MyBatis 的核心行為,在使用自定義插件之前,開發人員需要了解 MyBatis 內部的原理,這樣才能編寫出安全、高效的插件。

下圖展示了?MyBatis?執行一條?SQL?語句的大致過程。

接口層

接口層相對簡單,其核心是 SqlSession 接口,該接口中定義了 MyBatis 暴露給應用程序調用的 API,也就是上層應用與 MyBatis 交互的橋梁。接口層在接收到調用請求時,會調用核心處理層的相應模塊來完成具體的數據庫操作。

可以通過 MyBatis?源碼的目錄結構查看各個模塊的具體實現,目錄結構如下圖所示。

封裝的很清晰,基本是一個模塊一個?package。

結局:總結+分享

看完美團、字節、騰訊這三家的一二三面試問題,是不是感覺問的特別多,可能咱們真的又得開啟面試造火箭、工作擰螺絲的模式去準備下一次的面試了。

開篇有提及我可是足足背下了Java互聯網工程師面試1000題,多少還是有點用的呢,換湯不換藥,不管面試官怎么問你,抓住本質即可!能讀到此處的都是真愛,所以福利也為你準備,這份1000題免費送你!點擊這里免費領取

  • Java互聯網工程師面試1000題

image.png

而且從上面三家來看,算法與數據結構是必備不可少的呀,因此我建議大家可以去刷刷這本左程云大佬著作的 《程序員代碼面試指南 IT名企算法與數據結構題目最優解》,里面近200道真實出現過的經典代碼面試題。

  • 程序員代碼面試指南–IT名企算法與數據結構題目最優解

image.png

  • 其余像設計模式,建議可以看看下面這4份PDF(已經整理)

image.png

  • 更多的Java面試學習筆記如下,關于面試這一塊,我額外細分出Java基礎-中級-高級開發的面試+解析,以及調優筆記等等等。。。

image.png

更多的Java面試學習筆記如下,關于面試這一塊,我額外細分出Java基礎-中級-高級開發的面試+解析,以及調優筆記等等等。。。

[外鏈圖片轉存中…(img-ncBxFCrn-1627017549932)]

以上所提及的全部Java面試學習的PDF及筆記,如若皆是你所需要的,那么都可發送給你!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385530.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385530.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385530.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

System V 信號量

一、System V 信號量 1.信號量linux命令 顯示&#xff1a; ipcs -a 顯示所有共享內核對象 ipcs -s 顯示信號量 s semphore刪除&#xff1a; ipcrm -s ID 刪除信號量 二、主要函數應用 1. 函數原型&#xff1a; #include <sys/sem.h> int semget(key_t key, int …

Java進階之光!mysql安裝包安裝教程

我聽到的一些發聲 你們賺的錢已經可以了&#xff1a; 我一個發小是做土木工程的&#xff0c;上海大學博士&#xff0c;參與很多著名建筑的工程&#xff0c;但是從薪資上看&#xff0c;還不如一些稍微像樣的公司的6年多的高級開發。為什么&#xff1f;這就是行業的紅利&#xf…

Java進階學習資料!dockerjar內存

準備好套路 **①自我介紹&#xff1a;**千萬不能筐瓢&#xff0c;一定要牢記&#xff0c;自然流暢地介紹自己的學習經歷、工作經歷、項目經歷、個人優勢等等&#xff1b; **②抽象概念&#xff1a;**當面試官問你是如何理解多線程的時候&#xff0c;你要知道從定義、來源、實…

管道(二)

無名管道 測試代碼&#xff1a; #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <string.h>#define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); }while(0) #define TEST_SIZE 68*1024int mai…

Java進階:java字符串定位語句

正文 模塊&#xff08;Module&#xff09;、組件&#xff08;Component&#xff09;、包&#xff08;Package&#xff09;&#xff0c;這些概念對于我們技術同學并不陌生&#xff0c;但并不是所有人都能理解其要義。 深入理解之后&#xff0c;我才發現&#xff0c;其背后的深…

有名管道

一、有名管道 1. 為何提出有名管道的說法&#xff0c;目的是為了克服無名管道的不足之處&#xff1a; 無名管道只能是用于具有親緣關系的進程之間&#xff0c;這就限制了無名管道的使用范圍。有名管道可以使互不相關的兩個進程互相通信&#xff0c;有名管道可以通過路徑名來指…

Java進階:mysql的事務隔離級別面試題

一面&#xff1a; 阿里巴巴面試答案文末可以領取&#xff01; 1. 觸發新生代GC&#xff0c;如果存活對象總量大于survivor區容量&#xff0c;咋辦 2. 如果任務很多&#xff0c;線程池的阻塞隊列會撐爆內存的哪個區域 3. 棧在堆上嗎 4. GC root有哪些 5. 實例變量可以是GC…

有名管道(二)

一、從FIFO中讀取數據&#xff1a; 約定&#xff1a;如果一個進程為了從FIFO中讀取數據而以阻塞的方式打開FIFO&#xff0c;則稱內核為該進程的讀操作設置了阻塞標志。 如果有進程為寫而打開FIIF&#xff08;寫端存在&#xff09;&#xff0c;且當前FIFO內沒有數據&#xff0…

Java面試2021,java數據可視化項目

AOP簡介 AOP (Aspect Oriented Programing) 稱為&#xff1a;面向切面編程&#xff0c;它是一種編程思想。AOP 是 OOP&#xff08;面向對象編程 Object Oriented Programming)的思想延續 AOP采取橫向抽取機制&#xff0c;取代了傳統縱向繼承體系重復性代碼的編寫方式&#xff0…

gcc的使用

一、gcc編譯過程示意圖 分析&#xff1a; hello程序是一個高級&#xff23;語言程序&#xff0c;這種形式容易被人讀懂。為了在系統上運行hello.c程序&#xff0c;每條&#xff23;語句都必須轉化為低級機器指令。然后將這些指令打包成可執行目標文件格式&#xff0c;并以二進…

Java面試2021,java黑馬百度云

線程是否要鎖住同步資源 鎖住 悲觀鎖不鎖住 樂觀鎖 鎖住同步資源失敗 線程是否要阻塞 阻塞不阻塞自旋鎖&#xff0c;適應性自旋鎖 多個線程競爭同步資源的流程細節有沒有區別 不鎖住資源&#xff0c;多個線程只有一個能修改資源成功&#xff0c;其它線程會重試無鎖同一個線…

gdb使用

[sunbinlocalhost ~]$ gcc -Wall -g simple.c -o simple [sunbinlocalhost ~]$ ./simple Entering main ... result[1-100] 5050 result[1-10] 55 Exiting main ... [sunbinlocalhost ~]$ gdb simple 啟動gdb GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-110.el7 Copyrigh…

oppoJava面試題,java聲明全局變量的關鍵字

螞蟻一面 ??就做了?道算法題&#xff0c;要求兩?時內完成&#xff0c;給了?度為N的有重復元素的數組&#xff0c;要求輸出第10?的數。典型的TopK問題&#xff0c;快排算法搞定。算法題要注意的是合法性校驗、邊界條件以及異常的處理。另外&#xff0c;如果要寫測試?例&…

System V 消息隊列

一、System V 消息隊列 有一個隊列&#xff0c;隊列存放各種消息。每個進程可以把數據封存在消息中&#xff0c;再放入隊列。每個進程都可以拿到消息隊列&#xff0c;再從中取出/放入消息。 消息隊列也有管道一樣的不足&#xff0c;就是每個消息的最大長度是有上限的&#xf…

oppoJava面試題,java連接數據庫詳細步驟

美團一面&#xff08;50分鐘左右&#xff09; 進程和線程死鎖的必要條件網絡&#xff0c;七層協議TCP和UDP的區別hashmap 詳細講一下hashmap底層是如何解決hash沖突的hashmap和linkedhashmap數據庫的索引&#xff0c;為什么推薦自增id&#xff0c;有什么優點MySQL的引擎&#…

基本TCP套接字編程

1. socket函數原型&#xff1a; #include <sys/socket.h> int socket(int domain, int type, int protocol);2. bind函數原型&#xff1a; #include <sys/socket.h> int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);參數&#xff1a; ? st…

oppoJava面試題,騰訊社招三面多久聯系

梳理知識點&#xff0c;是快速提升技術的關鍵 前面講過&#xff0c;快速提升自己的技術硬實力其實是有方法的。大致就是梳理知識點夯實基礎進階深入學習實戰&#xff0c;下面我會一點點跟大家剖析&#xff0c;本文干貨滿滿&#xff0c;大家仔細閱讀。 ①梳理知識必備&#xff1…

oppoJava面試!傳智播客java基礎案例教程

零基礎如何學習Java&#xff1f; 首先&#xff0c;你要明白一點&#xff0c;Java入門不難&#xff01; 無論你是從事哪個行業&#xff0c;興趣一定是最好的老師&#xff0c;也是你學習的動力。 學習方式1&#xff1a;自學 自學模式其實我個人不建議絕大部分的人選擇&#x…

Redis高級項目實戰!北京java編程入門培訓

Dubbo面試專題 JVM面試專題 Java并發面試專題 Kafka面試專題 MongDB面試專題 MyBatis面試專題 MySQL面試專題 Netty面試專題 RabbitMQ面試專題 Redis面試專題 Spring Cloud面試專題 SpringBoot面試專題 zookeeper面試專題 最后 給大家送一個小福利 資料都是免費分享的&#xf…

poll函數

#include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);參數&#xff1a; fds&#xff1a;監聽的文件描述符【數組】 struct pllfd {int fd; 待監聽的文件描述符short events; 待監聽的文件描述符對應的監聽事件short revents; 傳入時&…