1. mybatis安裝
maven路徑
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
2. mybatis基礎(chǔ)
SqlSessionFactory配置
mybatis應(yīng)用的核心為一個(gè)SqlSessionFactory
實(shí)例吭狡。而SqlSessionFactory
又是由SqlSessionFactoryBuilder
對(duì)象依據(jù) mybatis-config.xml的配置生成的行拢。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
mybatis-config.xml
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/mybatis/example/DemoMapper.xml"/>
</mappers>
</configuration>
當(dāng)然你也可以用java代碼來(lái)替代xml文件實(shí)現(xiàn)配置,在這就不贅述了车吹,詳見官方文檔
Mapper配置
在這之后你就可以調(diào)用SqlSession.openSession()
方法來(lái)獲得SqlSession
對(duì)象來(lái)操作數(shù)據(jù)庫(kù)中跌。鑒于mybatis框架最核心的作用监右,分離SQL語(yǔ)句和java代碼梦谜。你還需要一個(gè)實(shí)際的Mapper接口的和一個(gè)對(duì)應(yīng)的mapper.xml文件來(lái)實(shí)現(xiàn)一個(gè)dao對(duì)象疚沐。
public interface DemoMapper() {
List<Demo> getDemo(Integer id);
}
<?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="org.mybatis.example.DemoMapper">
<select id="getDemo" resultType="Demo">
select * from Demo where id = #{id}
</select>
</mapper>
上述兩段代碼就是一組最基本的映射暂氯。注意不要忘記在mybatis-config.xml中使用<mappers>標(biāo)簽來(lái)進(jìn)行mapper注冊(cè)。有了上面的代碼之后就可以使用SqlSession
實(shí)例對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作了亮蛔。
需要注意的時(shí)SqlSesion時(shí)線程不安全的所以在每個(gè)方法結(jié)束前都要對(duì)它進(jìn)行關(guān)閉痴施。所以推薦使用下述代碼來(lái)確保其標(biāo)準(zhǔn)關(guān)閉。
try(SqlSession sesssion = SqlSessionFactory.openSession()) {
DemoMapper mapper = session.getMapper(DemoMapper.Class);
//TODO
}
生命周期問(wèn)題
- SqlSessionFactoryBuilder
這個(gè)類可以被實(shí)例化究流、使用和丟棄辣吃,一旦創(chuàng)建了 SqlSessionFactory,就不再需要它了芬探。 因此SqlSessionFactoryBuilder實(shí)例的最佳作用域是方法作用域(也就是局部方法變量)神得。 你可以重用 SqlSessionFactoryBuilder來(lái)創(chuàng)建多個(gè)SqlSessionFactory實(shí)例,但最好還是不要一直保留著它偷仿,以保證所有的 XML 解析資源可以被釋放給更重要的事情
- SqlSessionFactory
SqlSessionFactory一旦被創(chuàng)建就應(yīng)該在應(yīng)用的運(yùn)行期間一直存在哩簿,沒有任何理由丟棄它或重新創(chuàng)建另一個(gè)實(shí)例。使用SqlSessionFactory的最佳實(shí)踐是在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次酝静,多次重建 SqlSessionFactory 被視為一種代碼“壞習(xí)慣”节榜。因此 SqlSessionFactory 的最佳作用域是應(yīng)用作用域。有很多方法可以做到别智,最簡(jiǎn)單的就是使用單例模式或者靜態(tài)單例模式宗苍。
- SqlSession
每個(gè)線程都應(yīng)該有它自己的 SqlSession 實(shí)例。SqlSession的實(shí)例不是線程安全的,因此是不能被共享的讳窟,所以它的最佳的作用域是請(qǐng)求或方法作用域让歼。 絕對(duì)不能將 SqlSession 實(shí)例的引用放在一個(gè)類的靜態(tài)域,甚至一個(gè)類的實(shí)例變量也不行丽啡。 也絕不能將 SqlSession 實(shí)例的引用放在任何類型的托管作用域中谋右,比如 Servlet 框架中的 HttpSession。 如果你現(xiàn)在正在使用一種 Web 框架补箍,考慮將 SqlSession 放在一個(gè)和 HTTP 請(qǐng)求相似的作用域中倚评。 換句話說(shuō),每次收到 HTTP 請(qǐng)求馏予,就可以打開一個(gè) SqlSession,返回一個(gè)響應(yīng)后盔性,就關(guān)閉它霞丧。這個(gè)關(guān)閉操作很重要,為了確保每次都能執(zhí)行關(guān)閉操作冕香,應(yīng)該把這個(gè)關(guān)閉操作放到 finally 塊中蛹尝。
3. mybatis配置
注意:所有的xml配置都有固定的先后順序
屬性(properties)
這些屬性可以在外部進(jìn)行配置,并可以進(jìn)行動(dòng)態(tài)替換悉尾。你既可以在典型的 Java 屬性文件中配置這些屬性突那,也可以在 properties 元素的子元素中設(shè)置。例如:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
需要注意如果config.perproties中的屬性與<perproty>子標(biāo)簽中的屬性同名將會(huì)優(yōu)先使用config.perproties中的值
設(shè)置好的值可以在整個(gè)配置文件中以${name}的方式進(jìn)行取用构眯。詳見官方文檔
設(shè)置(settings)
設(shè)置標(biāo)簽是MyBatis 中極為重要的調(diào)整設(shè)置愕难,它們會(huì)改變 MyBatis 的運(yùn)行時(shí)行為。
常見設(shè)置有
設(shè)置名 | 作用 |
---|---|
cacheEnabled | 全局性地開啟或關(guān)閉所有映射器配置文件中已配置的任何緩存惫霸。 |
lazyLoadingEnabledd | 延遲加載的全局開關(guān)猫缭。當(dāng)開啟時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)延遲加載壹店。 特定關(guān)聯(lián)關(guān)系中可通過(guò)設(shè)置 fetchType 屬性來(lái)覆蓋該項(xiàng)的開關(guān)狀態(tài)猜丹。 |
mapUnderscoreToCamelCase | 是否開啟駝峰命名自動(dòng)映射,即從經(jīng)典數(shù)據(jù)庫(kù)列名 A_COLUMN 映射到經(jīng)典 Java 屬性名 aColumn硅卢。 |
詳見官方文檔
類型別名(typeAliases)
類型別名用于java類的簡(jiǎn)寫有三種定義方式
- 單獨(dú)指定
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
</typeAliases>
- 報(bào)名掃描方式
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
這種方式將會(huì)把類型的小寫作為該類別名進(jìn)行配置射窒。比如domain.blog.Author
在此方式下的別名為author
3.使用注解
注意該方式要以第二種方式為基礎(chǔ)!
@Alias("author")
public class Author {
...
}
- java類的內(nèi)建別名
java基本類型的別名為_classname
如_int
,其他類的別名為其類型小寫如string
将塑。
環(huán)境(environments)
MyBatis 可以配置成適應(yīng)多種環(huán)境脉顿,這種機(jī)制有助于將 SQL 映射應(yīng)用于多種數(shù)據(jù)庫(kù)之中, 現(xiàn)實(shí)情況下有多種理由需要這么做抬旺。例如弊予,開發(fā)、測(cè)試和生產(chǎn)環(huán)境需要有不同的配置开财;或者想在具有相同 Schema 的多個(gè)生產(chǎn)數(shù)據(jù)庫(kù)中使用相同的 SQL 映射汉柒。還有許多類似的使用場(chǎng)景误褪。
不過(guò)要記住:盡管可以配置多個(gè)環(huán)境碾褂,但每個(gè) SqlSessionFactory 實(shí)例只能選擇一種環(huán)境兽间。每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè) SqlSessionFactory 實(shí)例
<environments default="test">
<environment id="development">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
<environment id="test">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
可以通過(guò)修改default屬性值來(lái)修改默認(rèn)環(huán)境,也可以在創(chuàng)建SqlSessionFactory
通過(guò)參數(shù)指定
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream, environment);
數(shù)據(jù)源(dataSource)
dataSource 元素使用標(biāo)準(zhǔn)的 JDBC 數(shù)據(jù)源接口來(lái)配置 JDBC 連接對(duì)象的資源正塌。
- 大多數(shù) MyBatis 應(yīng)用程序會(huì)按示例中的例子來(lái)配置數(shù)據(jù)源嘀略。雖然數(shù)據(jù)源配置是可選的,但如果要啟用延遲加載特性乓诽,就必須配置數(shù)據(jù)源帜羊。
有三種內(nèi)建的數(shù)據(jù)源類型(也就是 type="[UNPOOLED|POOLED|JNDI]")
映射器(mappers)
即對(duì)mapper.xml資源的定位,有四種方式鸠天。
1. 使用相對(duì)于類路徑的資源引用
相對(duì)比較穩(wěn)妥讼育,適用于mapper數(shù)量少的時(shí)候
<!-- 使用相對(duì)于類路徑的資源引用 -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
<mapper resource="org/mybatis/builder/BlogMapper.xml"/>
<mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
2. 使用映射器接口實(shí)現(xiàn)類的完全限定類名
- 注意一定要將mapper.xml文件和接口放在同一個(gè)包下!
- 接口名要與.xml文件名要一一對(duì)應(yīng)保持一致稠集!
<!-- 使用映射器接口實(shí)現(xiàn)類的完全限定類名 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
<mapper class="org.mybatis.builder.BlogMapper"/>
<mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
3. 將包內(nèi)的映射器接口實(shí)現(xiàn)全部注冊(cè)為映射器
適用于大量mapper的情況奶段,同樣要將mapper.xml文件和接口放在同一個(gè)包下!
<!-- 將包內(nèi)的映射器接口實(shí)現(xiàn)全部注冊(cè)為映射器 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>
4. 使用完全限定資源定位符(URL)
不推薦使用
<!-- 使用完全限定資源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
官方文檔地址
mybatis – MyBatis 3