mybatis 筆記

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)寫有三種定義方式

  1. 單獨(dú)指定
<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
</typeAliases>
  1. 報(bào)名掃描方式
<typeAliases>
  <package name="domain.blog"/>
</typeAliases>

這種方式將會(huì)把類型的小寫作為該類別名進(jìn)行配置射窒。比如domain.blog.Author在此方式下的別名為author
3.使用注解
注意該方式要以第二種方式為基礎(chǔ)!

@Alias("author")
public class Author {
    ...
}

  1. 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末剥纷,一起剝皮案震驚了整個(gè)濱河市痹籍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晦鞋,老刑警劉巖蹲缠,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異悠垛,居然都是意外死亡吼砂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門鼎文,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渔肩,“玉大人,你說(shuō)我怎么就攤上這事拇惋≈苜耍” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵撑帖,是天一觀的道長(zhǎng)蓉坎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)胡嘿,這世上最難降的妖魔是什么蛉艾? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上勿侯,老公的妹妹穿的比我還像新娘拓瞪。我一直安慰自己,他們只是感情好助琐,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布祭埂。 她就那樣靜靜地躺著,像睡著了一般兵钮。 火紅的嫁衣襯著肌膚如雪蛆橡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天掘譬,我揣著相機(jī)與錄音泰演,去河邊找鬼。 笑死葱轩,一個(gè)胖子當(dāng)著我的面吹牛粥血,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酿箭,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼趾娃!你這毒婦竟也來(lái)了缭嫡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抬闷,失蹤者是張志新(化名)和其女友劉穎妇蛀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笤成,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡评架,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炕泳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵诞。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖培遵,靈堂內(nèi)的尸體忽然破棺而出浙芙,到底是詐尸還是另有隱情,我是刑警寧澤籽腕,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布嗡呼,位于F島的核電站,受9級(jí)特大地震影響皇耗,放射性物質(zhì)發(fā)生泄漏南窗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望万伤。 院中可真熱鬧窒悔,春花似錦、人聲如沸壕翩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)放妈。三九已至北救,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芜抒,已是汗流浹背珍策。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宅倒,地道東北人攘宙。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拐迁,于是被迫代替她去往敵國(guó)和親蹭劈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361