MyBatis 源碼分析——介紹


筆者第一次接觸跟MyBatis框架是在2009年未的時候。不過那個時候的他並不叫MyBatis,而是叫IBatis。2010年的時候改為現在的名字——MyBatis。這幾年過去了,對於筆者來講有一點陌生了。而且那個時候他也沒有這么出名。hibernate占了大部分市場。雖然筆者早年的時候查看過他的源碼,但是並沒有很深入去理解他。主要的原因是因為當時我還在看hibernate的源碼。太累了所以就沒有去認真的理解。現在筆者想要重新在來看一篇關於他的源碼並加強對他的理解。也是對自己過程的一種回歸吧。

想要查看源碼就要先了解他的一些概念。否則雲里來霧里去的什么也不懂。有很多朋友會選擇去圖書管買一些書來查看。當然這是可取的。那么如果不想的話,就可以去官網查看他們的介紹了——MyBatis網站。筆者也會按照官網上面的介紹來進行源碼上的查看。

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

學習環境


MyBatis源碼:mybatis-3-mybatis-3.4.1.

數據庫:SQL SERVER 2008

開發工具:Ecilpse,Maven

Java:1.8

開發環境


官網上也有寫一個篇關於入門的文章。 只是講的可能簡單了一點。但是這並不是沒有任何作用。筆者用的是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接口的工廠類吧。當然這還要回頭看一下源碼才能確定。

在實例的開發過程中,我們一定會用到一個用於配置對象實體相關的配置文件。就是上面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概念。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM