可參考ibatis\doc\MyBatis-3-User-Guide-zh_CN.pdf
1.ibatis->mybatis介紹
MyBatis 是支持普通 SQL查詢,存儲(chǔ)過(guò)程等一個(gè)輕量級(jí)的ORM中間件。與傳統(tǒng)的 JDBC 開(kāi)發(fā)相比, MyBatis 消除了幾乎所有的代碼和參數(shù)的手工設(shè)置;MyBatis 使用簡(jiǎn)單的 XML 或注解方式,用于配置和原始映射,將接口和 Java 的POJOs(Plan Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄;
mybatis 與 hibernate 比較:
Hibernate基本上可以自動(dòng)生成,其對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)提供了較為完整的封裝 ;開(kāi)發(fā)效率上, 如果使用純面向?qū)ο蠓绞紿ibernate 比較快,但如果以HQL其他方式相差不多;可維護(hù)性方面, mybatis框架是以sql的開(kāi)發(fā)方式,可以進(jìn)行細(xì)粒度的優(yōu)化 ;Hibernate自動(dòng)生成的sql效果不理想;MyBatis 是一個(gè)可以自定義SQL、存儲(chǔ)過(guò)程和高級(jí)映射的持久層框架。MyBatis 摒除了大部分的JDBC代碼、手工設(shè)置參數(shù)和結(jié)果集重獲。MyBatis 只使用簡(jiǎn)單的XML 和注解來(lái)配置和映射基本數(shù)據(jù)類型、Map 接口和POJO 到數(shù)據(jù)庫(kù)記錄。相對(duì)Hibernate和Apache OJB等“一站式”ORM解決方案而言,Mybatis 是一種“半自動(dòng)化”的ORM實(shí)現(xiàn)。
MyBatis的前身就是iBatis,iBatis本是apache的一個(gè)開(kāi)源項(xiàng)目,2010年這個(gè)項(xiàng)目由apahce sofeware foundation 遷移到了google code,并且改名為MyBatis;
MyBatis是把實(shí)體類和sql語(yǔ)句之間建立了映射關(guān)系,而Hibernate在實(shí)體類和數(shù)據(jù)庫(kù)之間建立了映射關(guān)系。
2.幾個(gè)基本概念-
Model:java中一般叫entity POJO 里邊主要是實(shí)體類 也就是對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的類 每個(gè)表對(duì)應(yīng)一個(gè)實(shí)體類 每個(gè)字段對(duì)應(yīng)實(shí)體類中的一個(gè)屬性
DAO:數(shù)據(jù)訪問(wèn)層 Mvc 結(jié)構(gòu)編程中訪問(wèn)數(shù)據(jù)庫(kù)的dao層提供數(shù)據(jù)持久化接口
3.mybatis-3.xjar(mybatis核心包)
mybatis-spring-1.x.jar(與Spring結(jié)合包)
總體來(lái)說(shuō) MyBatis 主要完成兩件事情:
根據(jù) JDBC 規(guī)范建立與數(shù)據(jù)庫(kù)的連接;
通過(guò)Annotaion/XML+JAVA反射技術(shù),實(shí)現(xiàn) Java 對(duì)象與關(guān)系數(shù)據(jù)庫(kù)之間相互轉(zhuǎn)化
5.所有的MyBatis 應(yīng)用都以SqlSessionFactory 實(shí)例為中心。SqlSessionFactory 實(shí)例通過(guò)SqlSessionFactoryBuilder 來(lái)獲得,SqlSessionFactoryBuilder 能夠從XML 配置文件或者通過(guò)自定義編寫的配置類(Configuration class),來(lái)創(chuàng)建一個(gè)SqlSessionFactory 實(shí)例。
1.從XML 中創(chuàng)建SqlSessionFactory 實(shí)例
建議您使用類資源路徑(classpathresource)來(lái)加載配置文件,但是您也能夠使用任何方式,包括文本文件路徑或者以file:// 開(kāi)頭URL 的方式。MyBatis 包括一個(gè)叫做Resources 的工具類(utility class),其中包含了一系列方法,使之能簡(jiǎn)單地從classpath 或其它地方加載配置文件。
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);
XML 配置文件包含MyBatis 框架的核心設(shè)置,包括獲取數(shù)據(jù)庫(kù)連接的DataSource 實(shí)例,和包括決定事務(wù)作用域范圍和控制的事務(wù)管理等。
1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE configuration
3
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4
"http://mybatis.org/dtd/mybatis-3-config.dtd">
5
<configuration>
6
<environments default="development">
7
<environment id="development">
8
<transactionManager type="JDBC"/>
9
<dataSource type="POOLED">
10
<property name="driver" value="${driver}"/>
11
<property name="url" value="${url}"/>
12
<property name="username" value="${username}"/>
13
<property name="password" value="${password}"/>
14
</dataSource>
15
</environment>
16
</environments>
17
<mappers>
18
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
19
</mappers>
20
</configuration>
21
2.
MyBatis 提供了一個(gè)完整的配置類(Configuration class),它提供了與XML 文件相同的配置選項(xiàng)。
1
TransactionFactory transactionFactory = new JdbcTransactionFactory();
2
Environment environment = new Environment("development", transactionFactory, dataSource);
3
Configuration configuration = new Configuration(environment);
4
configuration.addMapper(BlogMapper.class);
5
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
這種方式下的配置添加一個(gè)映射類(mapper class)。映射類是包含SQL 映射注解的Java 類,從而避免了使用XML。
3.
現(xiàn)在您已經(jīng)創(chuàng)建了一個(gè)SqlSessionFactory(指上面的sqlMapper),正如它名字暗示那樣,您可以通過(guò)它來(lái)創(chuàng)建一個(gè)SqlSession
實(shí)例。SqlSession 包含了所有執(zhí)行數(shù)據(jù)庫(kù)SQL 語(yǔ)句的方法。您能夠直接地通過(guò)SqlSession 實(shí)例執(zhí)行映射SQL 語(yǔ)句。例如:
1
SqlSession session = sqlMapper.openSession();
2
try
{
3
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
4
}
5
finally
6
{
7
session.close();
8
}
現(xiàn)在有一個(gè)更簡(jiǎn)便的方式,那就是對(duì)給定的映射語(yǔ)句,使用一個(gè)正確描述參數(shù)與返回值的接口(如BlogMapper.class),您就能更清晰地執(zhí)行類型安全的代碼,從而避免錯(cuò)誤和異常。
1
SqlSession session = sqlSessionFactory.openSession();
2
try
{
3
BlogMapper mapper = session.getMapper(BlogMapper.class);
4
Blog blog = mapper.selectBlog(101);
5
} finally
6
{
7
session.close();
8
}
4.探索映射SQL 語(yǔ)句
上面的例子中,映射語(yǔ)句已經(jīng)在XML 配置文件或注解中定義;,所有MyBatis 提供的功能特性都可以通過(guò)基于XML 映射配置文件 配置來(lái)實(shí)現(xiàn)
1
<?xml version="1.0" encoding="UTF-8" ?>
2
<!DOCTYPE mapper
3
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
<mapper namespace="org.mybatis.example.BlogMapper">
6
<select id="selectBlog" parameterType="int" resultType="Blog">//哈哈,參數(shù)類型,返回類型,就是一個(gè)方法
7
select * from Blog where id = #{id}
8
</select>
9
</mapper>
10
它定義了映射語(yǔ)句的名稱“selectBlog”,在命名空間“org.mybatis.example.BlogMapper”,允許您通過(guò)指定完整類名“org.mybatis.example.BlogMapper”來(lái)訪問(wèn)上面的例子:
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
這非常類似java 中通過(guò)完整類名來(lái)調(diào)用方法;這個(gè)名稱可以直接映射到一個(gè)具在相同命名空間的映射類,這個(gè)映射類有一個(gè)方法的名稱、參數(shù)及返回類型都與select映射語(yǔ)句相匹配。
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
第二種方法有很多好處。第一,它不依賴于字符串,所以更安全。第二,如果您的IDE 有自動(dòng)完成功能,您可以利用這功能很快導(dǎo)航到您的映射SQL 語(yǔ)句。第三,您不需要關(guān)注返回類型,不需要進(jìn)行強(qiáng)制轉(zhuǎn)換,因?yàn)槭褂肂logMapper 接口已經(jīng)限定了返回 類型,它會(huì)安全地返回;
對(duì)映射類還有一個(gè)更好的方法,就像前面的BlogMapper。它們的映射語(yǔ)句不需要完全在XML中配置。相反,它們可以使用Java 注解。例如上面的XML 配置可以替換為:
1
package org.mybatis.example;
2
public interface BlogMapper
3
{
4
@Select("SELECT * FROM blog WHERE id = #{id}")
5
Blog selectBlog(int id);
6
}
對(duì)簡(jiǎn)單的映射語(yǔ)句,使用注解可以顯得非常地清晰。但是java 注解本身的局限難于應(yīng)付更復(fù)雜的語(yǔ)句。如果您準(zhǔn)備要做某些復(fù)雜的事情,最好使用XML 文件來(lái)配置映射語(yǔ)句。
5.作用域和生命周期
SqlSessionFactoryBuilder-一旦您創(chuàng)造了SqlSessionFactory 就不需要再保留它了。所以SqlSessionFactoryBuilder 實(shí)例的最好的作
用域是方法體內(nèi)(即一個(gè)本地方法變量)SqlSessionFactory-一旦創(chuàng)建,SqlSessionFactory 將會(huì)存在于您的應(yīng)用程序整個(gè)運(yùn)行生命周期中;SqlSessionFactory 最好的作用
域范圍是一個(gè)應(yīng)用的生命周期范圍;最簡(jiǎn)單的方式是使用Singleton 模式或靜態(tài)Singleton 模式;,相反,您可能更愿意使用像Google Guice 或Spring 的依賴注入方式。這些框架允許您創(chuàng)造一個(gè)管理器,用于管理SqlSessionFactory 的生命周期SqlSession-每個(gè)線程都有一個(gè)SqlSession 實(shí)例,SqlSession 實(shí)例是不被共享的,并且不是線程安全的;因此最好的作用域是request 或者method。決不要用一個(gè)靜態(tài)字段或者一個(gè)類的實(shí)例字段來(lái)保存SqlSession 實(shí)例引用
1
SqlSession session = sqlSessionFactory.openSession();
2
try
{
3
// do work
4
} finally
5
{
6
session.close();
7
}
使用這一模式將保證所有的數(shù)據(jù)庫(kù)資源被正確地關(guān)閉
Mappers- 創(chuàng)建來(lái)綁定映射語(yǔ)句的接口,該Mapper 實(shí)例是從SqlSession 得到的。因此,所有mapper 實(shí)例的作用域跟創(chuàng)建它的SqlSession 一樣。但是,mapper 實(shí)例最好的作用域是method,也就是它們應(yīng)該在方法內(nèi)被調(diào)用,使用完即被銷毀;
1
SqlSession session = sqlSessionFactory.openSession();
2
try
{
3
BlogMapper mapper = session.getMapper(BlogMapper.class);
4
// do work
5
} finally
6
{session.close();}
6.Mapper XML 配置
MyBatis 的XML 配置文件包含了設(shè)置和影響MyBatis 行為的屬性;下面為層次結(jié)構(gòu)-
• configuration
o properties
o settings
o typeAliases
o typeHandlers
o objectFactory
o plugins
o environments
?? environment
• transactionManager
• dataSource
o mappers
1.properties 元素-可以配置在一個(gè)典型的Java 屬性文件中,或者通過(guò)properties 元素的子元素進(jìn)行配置;最優(yōu)先的屬性是通過(guò)方
法參數(shù)來(lái)傳遞的屬性,然后是通過(guò)resource/url 配置的屬性,最后是在MyBatis 的Mapper 配置文件中,properties 元素主體中
指定的屬性。
2.Settings 元素-設(shè)置和改變MyBatis 運(yùn)行中的行為,一個(gè)Settings 元素完整的配置例子如下:
1
<settings>
2
<setting name="cacheEnabled" value="true"/>
3
<setting name="lazyLoadingEnabled" value="true"/>
4
<setting name="multipleResultSetsEnabled" value="true"/>
5
<setting name="useColumnLabel" value="true"/>
6
<setting name="useGeneratedKeys" value="false"/>
7
<setting name="enhancementEnabled" value="false"/>
8
<setting name="defaultExecutorType" value="SIMPLE"/>
9
<setting name="defaultStatementTimeout" value="25000"/>
10
</settings>
11
3.typeAliases 元素-別名是一個(gè)較短的Java 類型的名稱。這只是與XML 配置文件相關(guān)聯(lián),減少輸入多余的完整類
名;
1
<typeAliases>
2
<typeAlias alias="Author" type="domain.blog.Author"/>
3
<typeAlias alias="Blog" type="domain.blog.Blog"/>
4
<typeAlias alias="Comment" type="domain.blog.Comment"/>
5
<typeAlias alias="Post" type="domain.blog.Post"/>
6
<typeAlias alias="Section" type="domain.blog.Section"/>
7
<typeAlias alias="Tag" type="domain.blog.Tag"/>
8
</typeAliases>
9
可以在想要使用"domain.blog.Blog"的地方使用別名“Blog”了;對(duì)常用的java 類型,已經(jīng)內(nèi)置了一些別名支持。這些別名都
是不區(qū)分大小寫的。注意java的基本數(shù)據(jù)類型,它們進(jìn)行了特別處理,加了“_”前綴。
4.typeHandlers 元素-當(dāng)MyBatis 設(shè)置參數(shù)到PreparedStatement 或者從ResultSet 結(jié)果集中取得值時(shí),就會(huì)使用TypeHandler 來(lái)處理
數(shù)據(jù)庫(kù)類型與java 類型之間轉(zhuǎn);能夠重寫類型處理器(type handlers),或者創(chuàng)建您自己的類型處理器去處理沒(méi)有被支持
的或非標(biāo)準(zhǔn)的類型。要做到這一點(diǎn),只要實(shí)現(xiàn)TypeHandler 接口(org.mybatis.type),并且將您的TypeHandler 類映射到j(luò)ava 類型和可選的
JDBC 類型即可。
5.objectFactory 元素-MyBatis 每次創(chuàng)建一個(gè)結(jié)果對(duì)象實(shí)例都會(huì)使用ObjectFactory 實(shí)例。使用默認(rèn)的ObjectFactory 與使用默認(rèn)的
構(gòu)造函數(shù)(或含參數(shù)的構(gòu)造函數(shù))來(lái)實(shí)例化目標(biāo)類沒(méi)什么差別。如果您想重寫ObjectFactory 來(lái)改變其默認(rèn)行為,那您能通
過(guò)創(chuàng)造您自己的ObjectFactory 來(lái)做到.->extends DefaultObjectFactory
6.Plugins 元素-MyBatis 允許您在映射語(yǔ)句執(zhí)行的某些點(diǎn)攔截方法調(diào)用->implements Interceptor
7.Environments 元素-MyBatis 能夠配置多套運(yùn)行環(huán)境,這有助于將您的SQL 映射到多個(gè)數(shù)據(jù)庫(kù)上;雖然您可以配置多個(gè)運(yùn)行環(huán)
境,但是每個(gè)SqlSessionFactory 實(shí)例只能選擇一個(gè)運(yùn)行環(huán)境->每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)SqlSessionFactory 實(shí)例
1
<environments default="development">
2
<environment id="development">
3
<transactionManager type="JDBC">//事務(wù)管理器
4
<property name="
" value="
"/>
5
</transactionManager>
6
<dataSource type="POOLED">//數(shù)據(jù)源
7
<property name="driver" value="${driver}"/>
8
<property name="url" value="${url}"/>
9
<property name="username" value="${username}"/>
10
<property name="password" value="${password}"/>
11
</dataSource>
12
</environment>
13
</environments>
7.1事務(wù)管理器-MyBatis 有兩種事務(wù)管理類型(即type=”[JDBC|MANAGED]”);JDBC – 這個(gè)配置直接使用JDBC 的提交和 回滾功能。它依賴于從數(shù)據(jù)源獲得連接來(lái)管理事務(wù)的生命周期;MANAGED – 這個(gè)配置基本上什么都不做。它從不提交或者回滾一個(gè)連接的事務(wù)。而是讓容器(例如:Spring 或者J2EE 應(yīng)用服務(wù)器)來(lái)管理事務(wù)的生命周期。
7.2dataSource 元素-dataSource 元素使用標(biāo)準(zhǔn)的JDBC 數(shù)據(jù)源接口來(lái)配置JDBC 連接對(duì)象源。
8.Mappers 元素-
現(xiàn)在,MyBatis 的行為屬性都已經(jīng)在上面的配置元素中配置好了,接下來(lái)開(kāi)始定義映射SQL語(yǔ)句;首先,我們需要告訴MyBatis 在哪里能夠找到我們定義的映射SQL 語(yǔ)句-可以使用類資源路徑或者URL(包括file:/// URLs)
// Using classpath relative resources
1
<mappers>
2
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
3
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
4
</mappers>
5
// Using url fully qualified paths
6
<mappers>
7
<mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
8
<mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
9
</mappers>
這些配置告訴MyBatis 在哪里找到SQL 映射文件。而其它的更詳細(xì)的信息配置在每一個(gè)SQL映射文件里。
7.SQL 映射XML 文件
MyBatis 真正強(qiáng)大之處就在這些映射語(yǔ)句,也就是它的魔力所在。對(duì)于它的強(qiáng)大功能,SQL 映射文件的配置卻非常簡(jiǎn)單。
如果您比較SQL 映射文件配置與JDBC 代碼,您很快可以發(fā)現(xiàn),使用SQL 映射文件配置可以節(jié)省95%的代碼量。MyBatis 被創(chuàng)建來(lái)專注于SQL,但又給您自己的實(shí)現(xiàn)極大的空間。SQL 映射XML 文件只有一些基本的元素需要配置,并且要按照下面的順序來(lái)定義:
• cache –在特定的命名空間配置緩存。
• cache-ref – 引用另外一個(gè)命名空間配置的緩存.
• resultMap – 最復(fù)雜也是最強(qiáng)大的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集里加載對(duì)象。
• sql – 能夠被其它語(yǔ)句重用的SQL 塊。
• insert –INSERT 映射語(yǔ)句
• update –UPDATE 映射語(yǔ)句
• delete –DELEETE 映射語(yǔ)句
• select –SELECT 映射語(yǔ)句
7.1Select 元素-
對(duì)簡(jiǎn)單的查詢,select 元素的配置是相當(dāng)簡(jiǎn)單的:
1
<select id=”selectPerson” parameterType=”int” resultType=”hashmap”>
2
SELECT * FROM PERSON WHERE ID = #{id}
3
</select>
這條語(yǔ)句叫做selectPerson,以int 型(或者Integer 型)作為參數(shù),并返回一個(gè)以數(shù)據(jù)庫(kù)列名作為鍵值的HashMap。
#{id}-它告訴MyBatis 生成PreparedStatement 參數(shù)。對(duì)于JDBC,像這個(gè)參數(shù)會(huì)被標(biāo)識(shí)為“?”;select 語(yǔ)句有很多的屬性允許您詳細(xì)配置每一條語(yǔ)句;如id,resultType,resultMap,statementType等。
7.2Insert、update、delete 元素
數(shù)據(jù)修改語(yǔ)句insert、update 和delete 的配置使用都非常相似:
useGeneratedKeys-僅限insert 語(yǔ)句時(shí)使用)告訴MyBatis 使用JDBC 的getGeneratedKeys 方法來(lái)獲取數(shù)據(jù)庫(kù)自動(dòng)生成主鍵如:MySQL、SQLSERVER 等關(guān)系型數(shù)據(jù)庫(kù)會(huì)有自增的字段)。默認(rèn):false
MyBatis 還有另外一種方式為不支持自動(dòng)生成主鍵的數(shù)據(jù)庫(kù)及JDBC 驅(qū)動(dòng)來(lái)生成鍵值-><selectKey語(yǔ)句
7.3Sql 元素-這個(gè)元素用來(lái)定義能夠被其它語(yǔ)句引用的可重用SQL 語(yǔ)句塊
7.4參數(shù)(Parameters)使用#{}語(yǔ)法會(huì)促使MyBatis 生成PreparedStatement并且安全地設(shè)置PreparedStatement 參數(shù)(=?)值-
7.5resultMap 元素-resultMap元素是MyBatis中最重要最強(qiáng)大的元素;<resultMap
......詳見(jiàn)文檔
動(dòng)態(tài)SQL-MyBatis 最強(qiáng)大的特性之一就是它的動(dòng)態(tài)語(yǔ)句功能;
• if
• choose (when, otherwise)
• trim (where, set)
• foreach
if元素-動(dòng)態(tài)SQL 最常做的事就是有條件地包括where 子句;
choose元素-有時(shí)候我們不想應(yīng)用所有的條件,而是想從多個(gè)選項(xiàng)中選擇一個(gè)。與java 中的switch 語(yǔ)句相似,MyBatis 提供了一個(gè)choose 元素。
trim, where, set 元素-here沒(méi)有出現(xiàn)的時(shí)候,您可以自定一個(gè)。<where> where 元素知道插入“where”如果它包含的標(biāo)簽中有內(nèi)容返回的話。此外,如果返回的內(nèi)容以“AND” 或者“OR”開(kāi)頭,它會(huì)把“AND” 或者“OR”去掉。
<trim prefix="WHERE" prefixOverrides="AND |OR ">…</trim>;overrides屬性使用了管道分隔的文本列表來(lái)覆寫,而且它的空白也不能忽略的。這樣的結(jié)果是移出了指定在overrides 屬性里字符,而在開(kāi)頭插入prefix屬性中指定的字符。
在動(dòng)態(tài)update語(yǔ)句里相似的解決方式叫做set,這個(gè)set元素能夠動(dòng)態(tài)地更新列;set 元素將動(dòng)態(tài)的配置SET 關(guān)鍵字,也用來(lái)剔除追加到條件末尾的任何不相關(guān)的逗號(hào)。等同
-<trim prefix="SET" suffixOverrides=",">…</trim>
Foreach 元素-另一個(gè)動(dòng)態(tài)SQL 經(jīng)常使用到的功能是集合迭代,通常用在IN 條件句
8.Java API
相比JDBC,MyBatis 極大地簡(jiǎn)化了您的代碼,并使您的代碼保持清晰、容易理解和維護(hù)。MyBatis3 推出了一系列重大的改進(jìn)來(lái)使SQL 映射更好地工作。
mybatis典型應(yīng)用目錄結(jié)構(gòu)-
/lib-MyBatis *.jar 文件存放在這里。
/src/...../data/..xml-MyBatis 物件放在這里。如: 映射器類(Mapper Classes), XML 配置文件, XML 映射文件。
/src/properties/- Properties 存放您自己的屬性配置文件
1.SqlSessions-SqlSession 是與MyBatis 一起工作的基本java 接口。通過(guò)這個(gè)接口,您可以執(zhí)行命令、獲得映射和管理事;SqlSessions 是由SqlSessionFactory 實(shí)例創(chuàng)建的。SqlSessionFactory 包含從不同的方式創(chuàng)建SqlSessions 實(shí)例的方法。而SqlSessionFactory 又是SqlSessionFactoryBuilder 從XML 文件,注解或者手動(dòng)編寫java 配置代碼中創(chuàng)建的。
1.1SqlSessionFactoryBuilder-SqlSessionFactoryBuilder 有五個(gè)build() 方法, 每個(gè)方法允許您從不同來(lái)源中創(chuàng)建SqlSession;
1
SqlSessionFactory build(Reader reader)
2
SqlSessionFactory build(Reader reader, String environment)
3
SqlSessionFactory build(Reader reader, Properties properties)
4
SqlSessionFactory build(Reader reader, String env, Properties props)
5
SqlSessionFactory build(Configuration config)
6
前四個(gè)方法較為常用,它們使用一個(gè)引用XML 文件的Reader 實(shí)例,或者更具體地說(shuō)是上面討論的SqlMapConfig.xml 文件。
可選參數(shù)是environment 和properties。Environment 決定加載的環(huán)境(包括數(shù)據(jù)源和事務(wù)管理)。
如果您調(diào)用一個(gè)傳遞environment 參數(shù)的build 方法,MyBatis 將使用所傳遞的環(huán)境的配置。->default
如果您調(diào)用一個(gè)傳遞properties 實(shí)例的方法,MyBatis 將會(huì)加載傳遞進(jìn)來(lái)的屬性,并使這些屬性在配置文件中生效。這些屬
性能夠應(yīng)用于配置文件中使用${propName}語(yǔ)法的地方。
例子-
1
String resource = "org/mybatis/builder/MapperConfig.xml";
2
Reader reader = Resources.getResourceAsReader(resource);
3
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
4
SqlSessionFactory factory = builder.build(reader);
注意,我們使用了Resources工具類,Resources工具類放在org.mybatis.io包中。Resources類,正如它的名字暗示,幫助我們
從類路徑、文件系統(tǒng)或者WEB URL加載資源。
最后一個(gè)build 方法傳遞一個(gè)Configuration 的實(shí)例。Configuration 類包含您需要了解的關(guān)于SqlSessionFactory 實(shí)例的所有事
情。Configuration 類有您已經(jīng)學(xué)過(guò)的所有配置開(kāi)關(guān),像java API 那樣提供方法暴露出來(lái)。
DataSource/TransactionFactory/Environment/Configuration/Configuration.set...()....
1.2 SqlSessionFactory-SqlSessionFactory 有六個(gè)方法用來(lái)創(chuàng)建SqlSession 實(shí)例。在一般情況下,選擇其中一個(gè)方法要考慮:
事務(wù)(Transaction)-您是否想為會(huì)話使用事務(wù)作用域,或者自動(dòng)提交(通常是指數(shù)據(jù)庫(kù)或者JDBC 驅(qū)動(dòng)沒(méi)有事務(wù)的情況下)
連接(Connection)-您想從配置數(shù)據(jù)源獲得一個(gè)連接,還是想自己提供一個(gè)?
執(zhí)行(Execution)-您想讓MyBatis 重復(fù)使用用PreparedStatements 還是希望批量更新(包括插入和刪除)?
1.3 SqlSession-正如前面提到的,SqlSession 實(shí)例是MyBatis 里最強(qiáng)大的類。SqlSession 實(shí)例里您會(huì)找到所有的執(zhí)行語(yǔ)句、提交
或者回滾事務(wù)、獲得mapper 實(shí)例的方法。
1.語(yǔ)句執(zhí)行方法組(Statement Execution Methods)-這些方法用來(lái)執(zhí)行定義在SQL 映射XML 文件中的select , insert,update
和delete 語(yǔ)句。它們都很好理解,執(zhí)行時(shí)使用語(yǔ)句的ID 和并傳入?yún)?shù)對(duì)象(基本類型,javaBean,POJO 或者M(jìn)ap)。
1
Object selectOne(String statement, Object parameter)
2
List selectList(String statement, Object parameter)
3
int insert(String statement, Object parameter)
4
int update(String statement, Object parameter)
5
int delete(String statement, Object parameter)
6
2.事務(wù)控制方法組(Transaction Control Methods)-有四個(gè)控制事務(wù)作用域的方法,當(dāng)然,如果您使用了自動(dòng)提交或者正在使用的是外部事務(wù)管理器,那這四個(gè)方法就沒(méi)什么作用。然而,如果您使用由Connection 實(shí)例管理的JDBC 的事務(wù)管理器,那這四個(gè)方法就非常管用:
1
void commit()
2
void commit(boolean force)
3
void rollback()
4
void rollback(boolean force)
3.清除會(huì)話層緩存(Clearing the Session Level Cache)-void clearCache(),SqlSession 實(shí)例有一個(gè)本地緩存,這個(gè)緩存在每次提交,回滾和關(guān)閉時(shí)進(jìn)行清除。如果不想在每次提交或者回滾時(shí)都清空緩存,可以明確地調(diào)用clearCache()方法來(lái)關(guān)閉
4.確保SqlSession 已經(jīng)關(guān)閉(Ensuring that SqlSession is Closed)-void close();-try/finally
5.使用Mappers-<T> T getMapper(Class<T> type)-因此,一個(gè)最常用的方式是使用Mapper 接口來(lái)執(zhí)行映射語(yǔ)句。一個(gè)Mapper 接口定義的方法要與SqlSession 執(zhí)行的方法相匹配,即Mapper 接口方法名與映射SQL 文件中的映射語(yǔ)句ID 相同Mapper 注解-java 配置API 是基于XML 的MyBatis 配置的基礎(chǔ),同時(shí)也是基于注解的配置基礎(chǔ)。注解提供了一個(gè)簡(jiǎn)單的方式來(lái)執(zhí)行簡(jiǎn)單映射語(yǔ)句而不引入大量的開(kāi)銷。
注意: 很不幸,java 注解在表現(xiàn)力與靈活性上是有限的。盡管花了很多時(shí)間來(lái)研究,設(shè)計(jì)與試驗(yàn),但是強(qiáng)大 的MyBatis 映射不能夠建立在注解之上。C#屬性則不會(huì)有這種限制。雖然如此,基于注解的配置并非沒(méi)有好 處的。
2.SelectBuilder-Java 開(kāi)發(fā)人員最討厭的事情就是不得不在java 代碼中嵌入SQL 語(yǔ)句。通常這樣做的原因是SQL 必須動(dòng)態(tài)生成,要 不然,您可以把SQL 定義在外部文件或者存儲(chǔ)過(guò)程中。
SelectBuilder 使用一組靜態(tài)導(dǎo)入方法和一個(gè)ThreadLocal 變量來(lái)啟用一個(gè)能夠很容易地組合條件并會(huì)注意所有SQL 格式的語(yǔ)法;概括地說(shuō),每一個(gè)SelectBuilder 方法都要以BEGIN()開(kāi)頭,以SQL()結(jié)束,這也是生成SQL 的范圍。要像上面那樣使用SelectBuilder 的方法,您簡(jiǎn)單地只要使用靜態(tài)導(dǎo)入就可以了,如:
import static org.mybatis.jdbc.SelectBuilder.*;
一旦被導(dǎo)入,您就能夠使用SelectBuilder 類的所有方法:BEGIN() / RESET()....SELECT(String)...WHERE(String)..SQL()
3.SqlBuilder-
與SelectBuilder類似,MyBatis 也包含了一個(gè)通用的SqlBuilder類,它包含了SelectBuilder的所有方法,同時(shí)也有一些針對(duì)inserts,
updates, 和deletes 的方法。這個(gè)類在DeleteProvider 、InsertProvider和UpdateProvider (以及SelectProvider )里生成SQL 語(yǔ)句
時(shí)非常有用。
import static org.mybatis.jdbc.SqlBuilder.*;
DELETE_FROM(String)....UPDATE(String)...
posted on 2011-12-26 22:38
landon 閱讀(8058)
評(píng)論(0) 編輯 收藏 所屬分類:
學(xué)習(xí)筆記