說在前面的話
今天開始,準備把 mybatis 的知識梳理一遍,為什麼梳理 mybatis 呢?因為 mybatis 的源碼最簡單啊(說什麼大實話)。no~no~no~,是因為現在的這些框架都和 springboot 整合在一起了,用起來是方便了,但是其中的原理就越不瞭解了。所以整理幾篇 mybatis 的文章分享給大家,配合代碼案例,希望大家有所收穫。另外因為這是第一篇,所以代碼量相對來說比較多,希望大家耐下看下去,畢竟也是下了一番功夫的,絕對是原創,如有雷同,肯定是他們抄襲的。
好了,話不多說,我們直接進入正題。
1 mybatis為我們做了哪些事情
- 使用連接池對連接進行管理 :連接池,這個不多說。
- SQL 和代碼分離,集中管理 :主要是 mapper.xml 文件,專門用來配置sql語句。
- 重複 SQL 的提取 :比如標籤。
- 參數映射和動態 SQL :比如 等。
- 結果集映射 :查詢結果後會映射成對象。
- 緩存管理 :一級緩存和二級緩存。
- 插件機制:分頁插件等。
2 準備工作(小demo,配合講解)
先整體說下需要有哪些東西:
- pom.xml 引入 mybatis 引入 jar 包。
- mybatis-config.xml 配置文件。
- mapper 接口和 mapper.xml 文件。
- 測試類。
2.1 pom.xml 文件 ,因為不和 spring/springBoot 集成,所以引入的 jar 包比較少。
org.mybatis mybatis 3.5.1 mysql mysql-connector-java 8.0.16
2.2 mybatis-config.xml文件(重點) ,db.properties 為數據庫的配置信息,不單獨貼出來。
2.3 mapper接口和 mapper.xml,Fruit為水果 pojo 類,只有id和name兩個屬性,不單獨貼出來
public interface FruitMapper { Fruit findById(Long id);}
id,name
2.4 測試方法(重點)
public class MybatisTest { @Test public void testSelect() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); try { FruitMapper mapper = session.getMapper(FruitMapper.class); Fruit fruit = mapper.findById(1L); System.out.println(fruit); } finally { session.close(); } }}
2.5 執行測試方法的結果
Created connection 2014838114.Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7817fd62]==> Preparing: select id,name from fruit where id =? ==> Parameters: 1(Long)<== Columns: id, name<== Row: 1, 蘋果<== Total: 1Fruit(id=1, name=蘋果)
簡單的 demo 就做好了,大家有興趣的話可以跟著做一下。下面才是本次的重點類容。
3 配置文件標籤作用
這裡只說下mybatis-config.xml裡面現在用到的標籤,後面用到了其他標籤時會說明。然後在最後一篇 mybatias 文章時,會把所有的標籤都整理出來,並且重要的會有例子說明,還會有自定義標籤裡面的類容的例子。
- configuration:這個是配置的最頂層標籤
- properties:用來配置數據庫連接的信息
- settings:全局配置標籤,這裡只配置了打印sql日誌
- typeAliases :類型別名,用來設置一些別名來代替 Java 的長類型聲明(如 java.lang.int 變為 int),減少配置編碼的冗餘
- mappers:映射器配置,配置mapper.xml文件
- environments:環境配置,主要用來配置數據源和事物
4 核心對象
最後講下測試類,裡面的代碼就是單獨使用 MyBatis 的全部流程。後面講源碼也是基於這個來講。首先說下里面的4個核心對象:
- SqlSessionFactory 全局唯一的,一旦被創建之後,在應用的運行期間一直存在。
- SqlSessionFactoryBuilder 這個就是用來構建 SqlSessionFactory ,一旦構建好後面就用不到。實際上就是解析 mapper.xml 和 mybatis-config.xml 裡面的標籤的屬性值設置到 Configuration這個類對應的屬性上。
- SqlSession :是一次會話,它不是線程安全的,不能在線程間共享。所以我們在請求開始的時候創建一個 SqlSession 對象,在請求結束或者說方法執行完畢的時候要及時關閉它。
- Mapper :是從 SqlSession 中獲取的(實際上是一個代理對象)。 它的作用是發送 SQL 來操作數據庫。
然後用個類比的方法,模擬一個場景來幫助大家理解一下這幾個核心對象的作用。場景是這樣的:比如說一個建築公司(SqlSessionFactory)需要修一個房子,首先是不是有設計圖紙(mapper.xml)和修房子需要用到的材料清單( mybatis-config.xml),然後採購部門(SqlSessionFactoryBuilder)根據材料清單去採購材料放到倉庫(Configuration)中。然後是工人師傅(SqlSession)根據設計圖紙(mapper.xml)和倉庫裡面的材料( mybatis-config.xml)去造房子(數據庫)。
這樣是不是要好理解一點。啊,都被自己的聰明給折服了(自戀中)。
5 主要的執行流程
主要流程就這些,裡面的細節後面會講。這幅圖的流程就不做講解了,可以看下上面的類比例子。
6 總結
回顧一下這節的類容:
- 一個簡單的demo。
- mybatis-config.xml裡面一級標籤的作用說明。
- 幾個核心對象的作用。
- 一個圖片說明了一下執行的流程。
這期 mybatis 的類容到這裡就結束了,覺得講的還可以的,記得點個贊哦!我們下期再見。
閱讀更多 科技伍小黑 的文章