mybatis系列之初識mybatis

說在前面的話

今天開始,準備把 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 包比較少。

<code><dependency> <groupid>org.mybatis/<groupid> <artifactid>mybatis/<artifactid> <version>3.5.1/<version> /<dependency> <dependency> <groupid>mysql/<groupid> <artifactid>mysql-connector-java/<artifactid> <version>8.0.16/<version> /<dependency>/<code>

2.2 mybatis-config.xml文件(重點) ,db.properties 為數據庫的配置信息,不單獨貼出來。

<code><configuration> <properties> <settings> <setting> /<settings> <typealiases> <typealias> /<typealiases> <environments> <environment> <transactionmanager> <datasource> <property> <property> <property> <property> /<datasource> /<environment> /<environments>

<mappers> <mapper> /<mappers>/<configuration>/<code>

2.3 mapper接口和 mapper.xml,Fruit為水果 pojo 類,只有id和name兩個屬性,不單獨貼出來

<code>public interface FruitMapper { Fruit findById(Long id);}/<code>

<code><mapper> id,name <select> select <include> from fruit where id =#{id} /<select>/<mapper>/<code>

2.4 測試方法(重點)

<code>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(); } }}/<code>

2.5 執行測試方法的結果

<code>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=蘋果)/<code>

簡單的 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 的類容到這裡就結束了,覺得講的還可以的,記得點個贊哦!我們下期再見。