筆者第一次接觸跟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概念。