mybatis簡介
任何一門語言的最好學習的途徑無非是它的官網:
http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。
JDBC與Mybatis的關係
JDBC需要先註冊驅動和數據庫信息、操作Connection、通過statement對象執行SQL,將結果返回給resultSet,然後從resultSet中讀取數據並轉換爲pojo對象,最後需要關閉數據庫相關資源。而且還需要自己對JDBC過程的異常進行捕捉和處理。
MyBatis對JDBC的封裝很好,幾乎可以取代Jdbc。
MyBatis使用SqlSessionFactoryBuilder來連接完成JDBC需要代碼完成的數據庫獲取和連接,減少了代碼的重複。JDBC將SQL語句寫到代碼裏,屬於硬編碼,非常不易維護,MyBatis可以將SQL代碼寫入xml中,易於修改和維護。JDBC的resultSet需要用戶自己去讀取並生成對應的POJO,MyBatis的mapper會自動將執行後的結果映射到對應的Java對象中。
mybatis重要組件
- Configuration
MyBatis所有的配置信息都維持在Configuration對象之中。
- SqlSession
作爲MyBatis工作的主要頂層API,表示和數據庫交互的會話,完成必要數據庫增刪改查功能
- Executor
MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護
- StatementHandler
封裝了JDBC Statement操作,負責對JDBC statement 的操作,如設置參數、將Statement結果集轉換成List集合。
- ParameterHandler
負責對用戶傳遞的參數轉換成JDBC Statement 所需要的參數,
- ResultSetHandler
負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合;
- TypeHandler
負責java數據類型和jdbc數據類型之間的映射和轉換
- MappedStatement
MappedStatement維護了一條<select|update|delete|insert>節點的封裝,
- SqlSource
負責根據用戶傳遞的parameterObject,動態地生成SQL語句,將信息封裝到BoundSql對象中,並返回
- BoundSql
表示動態生成的SQL語句以及相應的參數信息
Mybatis底層原理和結構
mybatis是如何獲取數據庫中的字段
原理
information_schema數據庫是MySQL自帶的,它提供了訪問數據庫元數據的方式。什麼是元數據呢?元數據是關於數據的數據,如數據庫名或表名,列的數據類型,或訪問權限等。有些時候用於表述該信息的其他術語包括“數據詞典”和“系統目錄”。
在MySQL中,把 information_schema 看作是一個數據庫,確切說是信息數據庫。其中保存着關於MySQL服務器所維護的所有其他數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權 限等。在INFORMATION_SCHEMA中,有數個只讀表。它們實際上是視圖,而不是基本表,因此,你將無法看到與之相關的任何文件。
information_schema表說明
SCHEMATA表:提供了當前mysql實例中所有數據庫的信息。是show databases的結果取之此表。
TABLES表:提供了關於數據庫中的表的信息(包括視圖)。詳細表述了某個表屬於哪個schema,表類型,表引擎,創建時間等信息。是show tables from schemaname的結果取之此表。
COLUMNS表:提供了表中的列信息。詳細表述了某張表的所有列以及每個列的信息。是show columns from schemaname.tablename的結果取之此表。
STATISTICS表:提供了關於表索引的信息。是show index from schemaname.tablename的結果取之此表。
USER_PRIVILEGES(用戶權限)表:給出了關於全程權限的信息。該信息源自mysql.user授權表。是非標準表。
SCHEMA_PRIVILEGES(方案權限)表:給出了關於方案(數據庫)權限的信息。該信息來自mysql.db授權表。是非標準表。
TABLE_PRIVILEGES(表權限)表:給出了關於表權限的信息。該信息源自mysql.tables_priv授權表。是非標準表。
COLUMN_PRIVILEGES(列權限)表:給出了關於列權限的信息。該信息源自mysql.columns_priv授權表。是非標準表。
CHARACTER_SETS(字符集)表:提供了mysql實例可用字符集的信息。是SHOW CHARACTER SET結果集取之此表。
COLLATIONS表:提供了關於各字符集的對照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:指明瞭可用於校對的字符集。這些列等效於SHOW COLLATION的前兩個顯示字段。
TABLE_CONSTRAINTS表:描述了存在約束的表。以及表的約束類型。
KEY_COLUMN_USAGE表:描述了具有約束的鍵列。
ROUTINES表:提供了關於存儲子程序(存儲程序和函數)的信息。此時,ROUTINES表不包含自定義函數(UDF)。名爲“mysql.proc name”的列指明瞭對應於INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:給出了關於數據庫中的視圖的信息。需要有show views權限,否則無法查看視圖信息。
TRIGGERS表:提供了關於觸發程序的信息。必須有super權限才能查看該表
查找當前數據庫的表信息:
第一種方法:
select * from information_schema.TABLES where TABLE_SCHEMA=(select database())
第二種方法:
#獲取表信息
show table status
查找當前表的所有字段信息:
第一種方法:
select * from information_schema.COLUMNS where TABLE_SCHEMA = (select database()) and TABLE_NAME=#{tableName}
第二種方法:
show full fields from `student`;
集成spring的多數據源處理
1、通過掃描包區分
git demo: https://gitee.com/lv-success/git-second/tree/master/course-3-mybatis/springBootMybatisMulidatasource
2、通過動態數據源區分
一般使用註解的形式,這裏先留着,後面的renren-fast項目
mybatis的讀寫分離
原理:
和多數據源處理差不多,mybatis做讀寫分離也有多種方法。通過攔截髮起請求的方法或執行的sql來自動判斷需要的數據源!
1、攔截髮起操作的方法名
需要自己約定增刪改查的前綴,然後根據前綴選擇數據源!
git demo:https://gitee.com/lv-success/git-second/tree/master/course-3-mybatis/bounterMybatis
2、攔截髮起操作的sql
git demo:https://github.com/shawntime/shawn-rwdb
mybatis源碼分析
關於mabatis的我覺得寫的比較好的博文,推薦給大家:
- 大閒人柴毛毛
MyBatis源碼解析(一)——MyBatis初始化過程解析
- zhjh256
- 南軻夢
mybatis plus的簡單運用
文章:https://www.java-mindmap.com/view/21