可參考ibatis\doc\MyBatis-3-User-Guide-zh_CN.pdf
1.ibatis->mybatis介紹
MyBatis 是支持普通 SQL查詢,存儲過程等一個輕量級的ORM中間件。與傳統的 JDBC 開發相比, MyBatis 消除了幾乎所有的代碼和參數的手工設置;MyBatis 使用簡單的 XML 或注解方式,用于配置和原始映射,將接口和 Java 的POJOs(Plan Old Java Objects,普通的 Java對象)映射成數據庫中的記錄;
mybatis 與 hibernate 比較:
Hibernate基本上可以自動生成,其對數據庫結構提供了較為完整的封裝 ;開發效率上, 如果使用純面向對象方式Hibernate 比較快,但如果以HQL其他方式相差不多;可維護性方面, mybatis框架是以sql的開發方式,可以進行細粒度的優化 ;Hibernate自動生成的sql效果不理想;MyBatis 是一個可以自定義SQL、存儲過程和高級映射的持久層框架。MyBatis 摒除了大部分的JDBC代碼、手工設置參數和結果集重獲。MyBatis 只使用簡單的XML 和注解來配置和映射基本數據類型、Map 接口和POJO 到數據庫記錄。相對Hibernate和Apache OJB等“一站式”ORM解決方案而言,Mybatis 是一種“半自動化”的ORM實現。
MyBatis的前身就是iBatis,iBatis本是apache的一個開源項目,2010年這個項目由apahce sofeware foundation 遷移到了google code,并且改名為MyBatis;
MyBatis是把實體類和sql語句之間建立了映射關系,而Hibernate在實體類和數據庫之間建立了映射關系。
2.幾個基本概念-
Model:java中一般叫entity POJO 里邊主要是實體類 也就是對應數據庫表中的類 每個表對應一個實體類 每個字段對應實體類中的一個屬性
DAO:數據訪問層 Mvc 結構編程中訪問數據庫的dao層提供數據持久化接口
3.mybatis-3.xjar(mybatis核心包)
mybatis-spring-1.x.jar(與Spring結合包)
總體來說 MyBatis 主要完成兩件事情:
根據 JDBC 規范建立與數據庫的連接;
通過Annotaion/XML+JAVA反射技術,實現 Java 對象與關系數據庫之間相互轉化
5.所有的MyBatis 應用都以SqlSessionFactory 實例為中心。SqlSessionFactory 實例通過SqlSessionFactoryBuilder 來獲得,SqlSessionFactoryBuilder 能夠從XML 配置文件或者通過自定義編寫的配置類(Configuration class),來創建一個SqlSessionFactory 實例。
1.從XML 中創建SqlSessionFactory 實例
建議您使用類資源路徑(classpathresource)來加載配置文件,但是您也能夠使用任何方式,包括文本文件路徑或者以file:// 開頭URL 的方式。MyBatis 包括一個叫做Resources 的工具類(utility class),其中包含了一系列方法,使之能簡單地從classpath 或其它地方加載配置文件。
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
XML 配置文件包含MyBatis 框架的核心設置,包括獲取數據庫連接的DataSource 實例,和包括決定事務作用域范圍和控制的事務管理等。

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

2.
MyBatis 提供了一個完整的配置類(Configuration class),它提供了與XML 文件相同的配置選項。

2

3

4

5

這種方式下的配置添加一個映射類(mapper class)。映射類是包含SQL 映射注解的Java 類,從而避免了使用XML。
3.
現在您已經創建了一個SqlSessionFactory(指上面的sqlMapper),正如它名字暗示那樣,您可以通過它來創建一個SqlSession
實例。SqlSession 包含了所有執行數據庫SQL 語句的方法。您能夠直接地通過SqlSession 實例執行映射SQL 語句。例如:

2

3

4

5

6

7

8

現在有一個更簡便的方式,那就是對給定的映射語句,使用一個正確描述參數與返回值的接口(如BlogMapper.class),您就能更清晰地執行類型安全的代碼,從而避免錯誤和異常。

2

3

4

5

6

7

8

4.探索映射SQL 語句
上面的例子中,映射語句已經在XML 配置文件或注解中定義;,所有MyBatis 提供的功能特性都可以通過基于XML 映射配置文件 配置來實現

2

3

4

5

6

7

8

9

10

它定義了映射語句的名稱“selectBlog”,在命名空間“org.mybatis.example.BlogMapper”,允許您通過指定完整類名“org.mybatis.example.BlogMapper”來訪問上面的例子:
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
這非常類似java 中通過完整類名來調用方法;這個名稱可以直接映射到一個具在相同命名空間的映射類,這個映射類有一個方法的名稱、參數及返回類型都與select映射語句相匹配。
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
第二種方法有很多好處。第一,它不依賴于字符串,所以更安全。第二,如果您的IDE 有自動完成功能,您可以利用這功能很快導航到您的映射SQL 語句。第三,您不需要關注返回類型,不需要進行強制轉換,因為使用BlogMapper 接口已經限定了返回 類型,它會安全地返回;
對映射類還有一個更好的方法,就像前面的BlogMapper。它們的映射語句不需要完全在XML中配置。相反,它們可以使用Java 注解。例如上面的XML 配置可以替換為:

2

3

4

5

6

對簡單的映射語句,使用注解可以顯得非常地清晰。但是java 注解本身的局限難于應付更復雜的語句。如果您準備要做某些復雜的事情,最好使用XML 文件來配置映射語句。
5.作用域和生命周期
SqlSessionFactoryBuilder-一旦您創造了SqlSessionFactory 就不需要再保留它了。所以SqlSessionFactoryBuilder 實例的最好的作
用域是方法體內(即一個本地方法變量)SqlSessionFactory-一旦創建,SqlSessionFactory 將會存在于您的應用程序整個運行生命周期中;SqlSessionFactory 最好的作用
域范圍是一個應用的生命周期范圍;最簡單的方式是使用Singleton 模式或靜態Singleton 模式;,相反,您可能更愿意使用像Google Guice 或Spring 的依賴注入方式。這些框架允許您創造一個管理器,用于管理SqlSessionFactory 的生命周期SqlSession-每個線程都有一個SqlSession 實例,SqlSession 實例是不被共享的,并且不是線程安全的;因此最好的作用域是request 或者method。決不要用一個靜態字段或者一個類的實例字段來保存SqlSession 實例引用

2

3

4

5

6

7

使用這一模式將保證所有的數據庫資源被正確地關閉
Mappers- 創建來綁定映射語句的接口,該Mapper 實例是從SqlSession 得到的。因此,所有mapper 實例的作用域跟創建它的SqlSession 一樣。但是,mapper 實例最好的作用域是method,也就是它們應該在方法內被調用,使用完即被銷毀;

2

3

4

5

6

6.Mapper XML 配置
MyBatis 的XML 配置文件包含了設置和影響MyBatis 行為的屬性;下面為層次結構-
• configuration
o properties
o settings
o typeAliases
o typeHandlers
o objectFactory
o plugins
o environments
?? environment
• transactionManager
• dataSource
o mappers
1.properties 元素-可以配置在一個典型的Java 屬性文件中,或者通過properties 元素的子元素進行配置;最優先的屬性是通過方
法參數來傳遞的屬性,然后是通過resource/url 配置的屬性,最后是在MyBatis 的Mapper 配置文件中,properties 元素主體中
指定的屬性。
2.Settings 元素-設置和改變MyBatis 運行中的行為,一個Settings 元素完整的配置例子如下:

2

3

4

5

6

7

8

9

10

11

3.typeAliases 元素-別名是一個較短的Java 類型的名稱。這只是與XML 配置文件相關聯,減少輸入多余的完整類
名;

2

3

4

5

6

7

8

9

可以在想要使用"domain.blog.Blog"的地方使用別名“Blog”了;對常用的java 類型,已經內置了一些別名支持。這些別名都
是不區分大小寫的。注意java的基本數據類型,它們進行了特別處理,加了“_”前綴。
4.typeHandlers 元素-當MyBatis 設置參數到PreparedStatement 或者從ResultSet 結果集中取得值時,就會使用TypeHandler 來處理
數據庫類型與java 類型之間轉;能夠重寫類型處理器(type handlers),或者創建您自己的類型處理器去處理沒有被支持
的或非標準的類型。要做到這一點,只要實現TypeHandler 接口(org.mybatis.type),并且將您的TypeHandler 類映射到java 類型和可選的
JDBC 類型即可。
5.objectFactory 元素-MyBatis 每次創建一個結果對象實例都會使用ObjectFactory 實例。使用默認的ObjectFactory 與使用默認的
構造函數(或含參數的構造函數)來實例化目標類沒什么差別。如果您想重寫ObjectFactory 來改變其默認行為,那您能通
過創造您自己的ObjectFactory 來做到.->extends DefaultObjectFactory
6.Plugins 元素-MyBatis 允許您在映射語句執行的某些點攔截方法調用->implements Interceptor
7.Environments 元素-MyBatis 能夠配置多套運行環境,這有助于將您的SQL 映射到多個數據庫上;雖然您可以配置多個運行環
境,但是每個SqlSessionFactory 實例只能選擇一個運行環境->每個數據庫對應一個SqlSessionFactory 實例

2

3

4



5

6

7

8

9

10

11

12

13

7.1事務管理器-MyBatis 有兩種事務管理類型(即type=”[JDBC|MANAGED]”);JDBC – 這個配置直接使用JDBC 的提交和 回滾功能。它依賴于從數據源獲得連接來管理事務的生命周期;MANAGED – 這個配置基本上什么都不做。它從不提交或者回滾一個連接的事務。而是讓容器(例如:Spring 或者J2EE 應用服務器)來管理事務的生命周期。
7.2dataSource 元素-dataSource 元素使用標準的JDBC 數據源接口來配置JDBC 連接對象源。
8.Mappers 元素-
現在,MyBatis 的行為屬性都已經在上面的配置元素中配置好了,接下來開始定義映射SQL語句;首先,我們需要告訴MyBatis 在哪里能夠找到我們定義的映射SQL 語句-可以使用類資源路徑或者URL(包括file:/// URLs)
// Using classpath relative resources

2

3

4

5

6

7

8

9

這些配置告訴MyBatis 在哪里找到SQL 映射文件。而其它的更詳細的信息配置在每一個SQL映射文件里。
7.SQL 映射XML 文件
MyBatis 真正強大之處就在這些映射語句,也就是它的魔力所在。對于它的強大功能,SQL 映射文件的配置卻非常簡單。
如果您比較SQL 映射文件配置與JDBC 代碼,您很快可以發現,使用SQL 映射文件配置可以節省95%的代碼量。MyBatis 被創建來專注于SQL,但又給您自己的實現極大的空間。SQL 映射XML 文件只有一些基本的元素需要配置,并且要按照下面的順序來定義:
• cache –在特定的命名空間配置緩存。
• cache-ref – 引用另外一個命名空間配置的緩存.
• resultMap – 最復雜也是最強大的元素,用來描述如何從數據庫結果集里加載對象。
• sql – 能夠被其它語句重用的SQL 塊。
• insert –INSERT 映射語句
• update –UPDATE 映射語句
• delete –DELEETE 映射語句
• select –SELECT 映射語句
7.1Select 元素-
對簡單的查詢,select 元素的配置是相當簡單的:

2

3

這條語句叫做selectPerson,以int 型(或者Integer 型)作為參數,并返回一個以數據庫列名作為鍵值的HashMap。
#{id}-它告訴MyBatis 生成PreparedStatement 參數。對于JDBC,像這個參數會被標識為“?”;select 語句有很多的屬性允許您詳細配置每一條語句;如id,resultType,resultMap,statementType等。
7.2Insert、update、delete 元素
數據修改語句insert、update 和delete 的配置使用都非常相似:
useGeneratedKeys-僅限insert 語句時使用)告訴MyBatis 使用JDBC 的getGeneratedKeys 方法來獲取數據庫自動生成主鍵如:MySQL、SQLSERVER 等關系型數據庫會有自增的字段)。默認:false
MyBatis 還有另外一種方式為不支持自動生成主鍵的數據庫及JDBC 驅動來生成鍵值-><selectKey語句
7.3Sql 元素-這個元素用來定義能夠被其它語句引用的可重用SQL 語句塊
7.4參數(Parameters)使用#{}語法會促使MyBatis 生成PreparedStatement并且安全地設置PreparedStatement 參數(=?)值-
7.5resultMap 元素-resultMap元素是MyBatis中最重要最強大的元素;<resultMap
......詳見文檔
動態SQL-MyBatis 最強大的特性之一就是它的動態語句功能;
• if
• choose (when, otherwise)
• trim (where, set)
• foreach
if元素-動態SQL 最常做的事就是有條件地包括where 子句;
choose元素-有時候我們不想應用所有的條件,而是想從多個選項中選擇一個。與java 中的switch 語句相似,MyBatis 提供了一個choose 元素。
trim, where, set 元素-here沒有出現的時候,您可以自定一個。<where> where 元素知道插入“where”如果它包含的標簽中有內容返回的話。此外,如果返回的內容以“AND” 或者“OR”開頭,它會把“AND” 或者“OR”去掉。
<trim prefix="WHERE" prefixOverrides="AND |OR ">…</trim>;overrides屬性使用了管道分隔的文本列表來覆寫,而且它的空白也不能忽略的。這樣的結果是移出了指定在overrides 屬性里字符,而在開頭插入prefix屬性中指定的字符。
在動態update語句里相似的解決方式叫做set,這個set元素能夠動態地更新列;set 元素將動態的配置SET 關鍵字,也用來剔除追加到條件末尾的任何不相關的逗號。等同
-<trim prefix="SET" suffixOverrides=",">…</trim>
Foreach 元素-另一個動態SQL 經常使用到的功能是集合迭代,通常用在IN 條件句
8.Java API
相比JDBC,MyBatis 極大地簡化了您的代碼,并使您的代碼保持清晰、容易理解和維護。MyBatis3 推出了一系列重大的改進來使SQL 映射更好地工作。
mybatis典型應用目錄結構-
/lib-MyBatis *.jar 文件存放在這里。
/src/...../data/..xml-MyBatis 物件放在這里。如: 映射器類(Mapper Classes), XML 配置文件, XML 映射文件。
/src/properties/- Properties 存放您自己的屬性配置文件
1.SqlSessions-SqlSession 是與MyBatis 一起工作的基本java 接口。通過這個接口,您可以執行命令、獲得映射和管理事;SqlSessions 是由SqlSessionFactory 實例創建的。SqlSessionFactory 包含從不同的方式創建SqlSessions 實例的方法。而SqlSessionFactory 又是SqlSessionFactoryBuilder 從XML 文件,注解或者手動編寫java 配置代碼中創建的。
1.1SqlSessionFactoryBuilder-SqlSessionFactoryBuilder 有五個build() 方法, 每個方法允許您從不同來源中創建SqlSession;

2

3

4

5

6

前四個方法較為常用,它們使用一個引用XML 文件的Reader 實例,或者更具體地說是上面討論的SqlMapConfig.xml 文件。
可選參數是environment 和properties。Environment 決定加載的環境(包括數據源和事務管理)。
如果您調用一個傳遞environment 參數的build 方法,MyBatis 將使用所傳遞的環境的配置。->default
如果您調用一個傳遞properties 實例的方法,MyBatis 將會加載傳遞進來的屬性,并使這些屬性在配置文件中生效。這些屬
性能夠應用于配置文件中使用${propName}語法的地方。
例子-

2

3

4

注意,我們使用了Resources工具類,Resources工具類放在org.mybatis.io包中。Resources類,正如它的名字暗示,幫助我們
從類路徑、文件系統或者WEB URL加載資源。
最后一個build 方法傳遞一個Configuration 的實例。Configuration 類包含您需要了解的關于SqlSessionFactory 實例的所有事
情。Configuration 類有您已經學過的所有配置開關,像java API 那樣提供方法暴露出來。
DataSource/TransactionFactory/Environment/Configuration/Configuration.set...()....
1.2 SqlSessionFactory-SqlSessionFactory 有六個方法用來創建SqlSession 實例。在一般情況下,選擇其中一個方法要考慮:
事務(Transaction)-您是否想為會話使用事務作用域,或者自動提交(通常是指數據庫或者JDBC 驅動沒有事務的情況下)
連接(Connection)-您想從配置數據源獲得一個連接,還是想自己提供一個?
執行(Execution)-您想讓MyBatis 重復使用用PreparedStatements 還是希望批量更新(包括插入和刪除)?
1.3 SqlSession-正如前面提到的,SqlSession 實例是MyBatis 里最強大的類。SqlSession 實例里您會找到所有的執行語句、提交
或者回滾事務、獲得mapper 實例的方法。
1.語句執行方法組(Statement Execution Methods)-這些方法用來執行定義在SQL 映射XML 文件中的select , insert,update
和delete 語句。它們都很好理解,執行時使用語句的ID 和并傳入參數對象(基本類型,javaBean,POJO 或者Map)。

2

3

4

5

6

2.事務控制方法組(Transaction Control Methods)-有四個控制事務作用域的方法,當然,如果您使用了自動提交或者正在使用的是外部事務管理器,那這四個方法就沒什么作用。然而,如果您使用由Connection 實例管理的JDBC 的事務管理器,那這四個方法就非常管用:

2

3

4

3.清除會話層緩存(Clearing the Session Level Cache)-void clearCache(),SqlSession 實例有一個本地緩存,這個緩存在每次提交,回滾和關閉時進行清除。如果不想在每次提交或者回滾時都清空緩存,可以明確地調用clearCache()方法來關閉
4.確保SqlSession 已經關閉(Ensuring that SqlSession is Closed)-void close();-try/finally
5.使用Mappers-<T> T getMapper(Class<T> type)-因此,一個最常用的方式是使用Mapper 接口來執行映射語句。一個Mapper 接口定義的方法要與SqlSession 執行的方法相匹配,即Mapper 接口方法名與映射SQL 文件中的映射語句ID 相同Mapper 注解-java 配置API 是基于XML 的MyBatis 配置的基礎,同時也是基于注解的配置基礎。注解提供了一個簡單的方式來執行簡單映射語句而不引入大量的開銷。
注意: 很不幸,java 注解在表現力與靈活性上是有限的。盡管花了很多時間來研究,設計與試驗,但是強大 的MyBatis 映射不能夠建立在注解之上。C#屬性則不會有這種限制。雖然如此,基于注解的配置并非沒有好 處的。
2.SelectBuilder-Java 開發人員最討厭的事情就是不得不在java 代碼中嵌入SQL 語句。通常這樣做的原因是SQL 必須動態生成,要 不然,您可以把SQL 定義在外部文件或者存儲過程中。
SelectBuilder 使用一組靜態導入方法和一個ThreadLocal 變量來啟用一個能夠很容易地組合條件并會注意所有SQL 格式的語法;概括地說,每一個SelectBuilder 方法都要以BEGIN()開頭,以SQL()結束,這也是生成SQL 的范圍。要像上面那樣使用SelectBuilder 的方法,您簡單地只要使用靜態導入就可以了,如:
import static org.mybatis.jdbc.SelectBuilder.*;
一旦被導入,您就能夠使用SelectBuilder 類的所有方法:BEGIN() / RESET()....SELECT(String)...WHERE(String)..SQL()
3.SqlBuilder-
與SelectBuilder類似,MyBatis 也包含了一個通用的SqlBuilder類,它包含了SelectBuilder的所有方法,同時也有一些針對inserts,
updates, 和deletes 的方法。這個類在DeleteProvider 、InsertProvider和UpdateProvider (以及SelectProvider )里生成SQL 語句
時非常有用。
import static org.mybatis.jdbc.SqlBuilder.*;
DELETE_FROM(String)....UPDATE(String)...