MyBatis 源碼分析——介紹

筆者第一次接觸跟MyBatis框架是在2009年未的時候。不過那個時候的他並不叫MyBatis,而是叫IBatis。2010年的時候改成如今的名字——MyBatis。這幾年過去了,對於筆者來說有一點陌生了。並且那個時候他也沒有這麼出名。hibernate佔了大部分市場。雖然筆者早年的時候查看過他的源碼,可是並無很深刻去理解他。主要的緣由是由於當時我還在看hibernate的源碼。太累了因此就沒有去認真的理解。如今筆者想要從新在來看一篇關於他的源碼並增強對他的理解。也是對本身過程的一種迴歸吧。html

想要查看源碼就要先了解他的一些概念。不然雲裏來霧裏去的什麼也不懂。有不少朋友會選擇去圖書管買一些書來查看。固然這是可取的。那麼若是不想的話,就能夠去官網查看他們的介紹了——MyBatis網站。筆者也會按照官網上面的介紹來進行源碼上的查看。git

ORM思想的傳播述造了不少ORM框架。事實上筆者也想把MyBatis定義爲ORM框架。可是開發的過程當中筆者感受最多的是他在管理SQL語句。雖然在最後的結果會應射出對應的實體對象。但是仍是我以爲MyBatis的管理SQL語句纔是這個框架的核心。官網的介紹劃分爲四塊來介紹MyBatis——XML配置、XML映射文件、動態SQL、日誌。對於開發人員來說主要看完這四塊就能夠了。固然關於什麼是ORM的話,這個筆者就不在作什麼相關的解釋。網絡上也有一片的資料足夠你學習的。github

學習環境sql

MyBatis源碼:mybatis-3-mybatis-3.4.1.數據庫

數據庫:SQL SERVER 2008性能優化

開發工具:Ecilpse,Maven網絡

Java:1.8session

開發環境mybatis

官網上也有寫一個篇關於入門的文章。 只是講的可能簡單了一點。可是這並非沒有任何做用。筆者用的是Maven來引入MyBatis的源碼的。雖然他有自帶的測試代碼,不過筆者仍是但願讀者們能本身在新建一個項目來學習。這樣子方便本身動手作一些測試來加深映像。雖然能夠用Maven來構建JAR。可是筆者沒有這樣子作。而是新建的項目裏面引用MyBatis的源碼。相信你們對Ecilpse裏面的Build Path的Projects選擇卡並不陌生。這樣子方便查看源碼,而不是在從JAR包中關聯對應的源碼。架構

上面的圖片即是筆者導入以後項目源碼。事實對咱們學習最快最有用的應該是test這個部分的例子。你徹底能夠從例子中找到你不知道如何使用的功能點。

有了上面的源碼,固然筆者也會簡單的測試一下這個源碼有沒有錯,能不能用。以下代碼

複製代碼

public static void main(String[] args) {

        try {
            
            System.out.println("開始mybatis實驗");
            
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession session = sqlSessionFactory.openSession();
            IProductMapper dao = session.getMapper(IProductMapper.class);
            
            List<Product> products = dao.SelectProducts(30);
            
            session.close();
            
            System.out.println("結束mybatis實驗");
            
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }

複製代碼

相信沒有用看不懂這段代碼。事實上咱們能夠知道想要用MyBatis就離不開他相關的配置信息。相對的MyBatis而言筆者以爲仍是比較簡的。筆者的例子項目裏面有一個文件叫mybatis-config.xml文件。相信你們看了就知道他的做用。jdbc.properties這個文件是存放了相關的數據庫配置信息。無關緊要,若是不要的話,就直接接在dataSource節點上直接修改數據庫信息。

複製代碼

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <properties resource="jdbc.properties" />
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${database.driver}" />
                <property name="url" value="${database.url}" />
                <property name="username" value="${database.username}" />
                <property name="password" value="${database.password}" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/aomi/dao/ProductMapper.xml" />
    </mappers>

</configuration>

複製代碼

想要研究一個源碼框架必定要找到切入口。從上面的例子代碼中咱們能夠充分的分析出——SqlSessionFactoryBuilder類就是源碼的切入口。相信你們可能會想到經常使用的JAVA模式中的一種叫Builder模式。經過SqlSessionFactoryBuilder類的build方法咱們能夠拿到一個相關的類——SqlSessionFactory類例化。實際就是DefaultSqlSessionFactory類。例子源碼中咱們能夠看到後面的操做必定離不開SqlSession接口實例。而從名字上來說,咱們能夠猜出SqlSessionFactory類好像是SqlSession接口的工廠類吧。固然這還要回頭看一下源碼才能肯定。在這裏順便給你們推薦一個架構交流羣:617434785,裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系。還能領取免費的學習資源。相信對於已經工做和遇到技術瓶頸的碼友,在這個羣裏會有你須要的內容。

在實例的開發過程當中,咱們必定會用到一個用於配置對象實體相關的配置文件。就是上面XML信息中的Mapper節點部分的信息。以下

<mappers>
        <mapper resource="com/aomi/dao/ProductMapper.xml" />
    </mappers>

MyBatis的亮點筆者認爲就是管理SQL語句。否則筆者真以爲MyBatis好像也沒有多大的優勢。而相似上面的XML文件中就是存放SQL語句。固然一個實體對象可能對應一個XML文件。例如筆者寫的例子同樣子。以下

複製代碼

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.aomi.dao.IProductMapper">

    <select id="SelectProducts" resultMap="result">
        select * from Products where #{id} > ProductID
    </select>

    <resultMap type="com.aomi.vo.Product" id="result" autoMapping="true">
    </resultMap>
</mapper>

複製代碼

關於如何管理SQL語句的話,筆者以爲你去查看官網來的更實際一點。而筆者想要講的是不論是上面的XML配置文件,仍是對實體的增刪改查都離不開上面的SqlSession接口實例。看樣子咱們很清楚只要知道SqlSession接口實例的工做原理,就能夠說理解了70%的MyBatis概念。