MyBatis學(xué)習(xí)筆記

復(fù)習(xí)了下,把不難又容易遺忘的部分記錄了下來嚎卫。
demo記錄在https://github.com/wangyu19810820/MyBatisWebDemo

1.MyBatis也有一個主控配置文件
文件名隨意售担,在構(gòu)建(build)SqlSessionFactory的時候傳入
也可以通過代碼直接構(gòu)建設(shè)置

2.數(shù)據(jù)庫操作一般在SqlSession中完成

3.常用類型的別名
在配置映射關(guān)系,自定義構(gòu)造函數(shù)的時候酷宵,需要指定jdbc類型和java類型
其中java類型的別名簡寫有如下規(guī)則
Integer可用:Integer或粮,integer幽歼,int
int可用:_int
String可用:String朵锣,string
其余類推

4.映射文件中的insert語句,獲取數(shù)據(jù)庫自增主鍵甸私,需要指定useGeneratedKeys和keyProperty
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into USER (name) values (#{name})
</insert>

5.映射文件中的參數(shù)
有兩種猪勇,#{xxx},${xxx}颠蕴,前一種自動轉(zhuǎn)義泣刹,后一種直接拼接,會有SQL注入安全問題

單參數(shù)可寫成任何值犀被,比如:#{name}椅您,但是在動態(tài)sql中需要用_parameter,比如:<if test="_parameter != null">.......</if>

多個參數(shù)寡键,會自動轉(zhuǎn)換成map

6.鑒別器discriminator
可以用內(nèi)聯(lián)寫法或外部resultMap掀泳,但是一個resultMap內(nèi)只能一個discriminator
用外部resultMap后,這行數(shù)據(jù)整體應(yīng)用新映射
用內(nèi)聯(lián)寫法西轩,會結(jié)合原映射和新映射
沒匹配成功员舵,會使用原映射
<resultMap id="defaultResultMap" type="com.model.User" autoMapping="false">
<id column="id" property="id"></id>
<result column="name" property="name"></result>

<discriminator javaType="_int" column="usertype">

<case value="0" resultMap="studentResultMap">
</case>

<case value="1" resultType="com.model.User">
<result column="name" property="otherName"></result>
<result column="teachernumber" property="teacherNumber"></result>
</case>

</discriminator>
</resultMap>

7.一對一映射,一對多映射
一種是單條sql查詢出所有內(nèi)容藕畔,直接映射成結(jié)果對象

<association property="college" columnPrefix="c_"
resultMap="mapper.CollegeMapper.defaultResultMap">
</association>

    <!-- 一對多 -->
    <collection property="scoreList" columnPrefix="s_" 
                ofType="com.model.Score">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        <result property="score" column="score"></result>
    </collection>

因為不同表內(nèi)的字段很容易重名马僻,所以要單獨設(shè)置映射關(guān)系,或者指定前綴如columnPrefix="c_"
這種映射方法注服,在分頁查詢時韭邓,有分頁數(shù)量的bug難以解決

另一種是多條sql查詢內(nèi)容

<association fetchType="eager" property="college" column="COLLEGEID"
select="mapper.CollegeMapper.selectCollegeById">
</association>

   <!-- 一對多 -->
    <collection fetchType="lazy" property="scoreList" column="id"
                ofType="com.model.Score"
                select="mapper.ScoreMapper.selectScoreByUserId">
    </collection>

fetchType="lazy"配置成懶加載,該屬性項只在新版本內(nèi)才有效
這種映射方法溶弟,在分頁查詢時女淑,無數(shù)量bug,比較簡單

  1. 自動映射
    啟用自動映射可以大大減少映射文件的代碼量辜御,尤其是為新項目構(gòu)建代碼鸭你,比較方便
    但是也會引入一些干擾項,最好能清楚的認識其運作機制

主控配置文件中可以設(shè)置自動映射等級autoMappingBehavior,默認值PARTIAL是本表自動映射袱巨,join表手動映射袜茧,比較合理的。官方文檔也舉例了瓣窄,用FULL的話,很容易出現(xiàn)id映射錯誤

mapUnderscoreToCamelCase指定映射規(guī)則是否進行下劃線轉(zhuǎn)駝峰轉(zhuǎn)換纳鼎,很實用

字段如果沒有被手工映射俺夕,則將被自動映射。

9.分頁
方式一:Mybatis內(nèi)置了RowBounds分頁對象贱鄙,只需在Dao方法的參數(shù)中添加RowBounds參數(shù)就可以了劝贸。但,它是通過操縱jdbc的ResultSet定位來實現(xiàn)分頁逗宁。
方式二:PageHelper插件是通過攔截修改sql映九,來實現(xiàn)數(shù)據(jù)分頁的。

11.分頁和一對多結(jié)合使用的時候瞎颗,有結(jié)果數(shù)目不正確的問題
內(nèi)置的RowBounds分頁和PageHelper插件件甥,都會有問題,解決不了
解決方案哼拔,一種是采用多條sql獲取一對多數(shù)據(jù)引有,參考第7條
另一種是變換sql寫法,將分頁參數(shù)傳入xml中
select u.ID, u.NAME, u.USERTYPE,
c.ID C_ID, c.NAME C_NAME,
s.ID S_ID, s.NAME S_NAME, s.SCORE S_SCORE
from USER u
left join COLLEGE c on u.COLLEGEID = c.id
left join SCORE s on u.ID = s.USERID
where u.ID in (select ID from USER limit #{pageSize} offset #{pageSize} * #{pageNumber})

12.動態(tài)sql倦逐,動態(tài)組裝sql
包含if,choose,trim,where,set,foreach等
sql標簽可復(fù)用sql片段
bind標簽可從OGNL表達式中創(chuàng)建一個變量并將其綁定到上下文

13.支持多數(shù)據(jù)庫
配置文件啟用數(shù)據(jù)庫廠商標識譬正,并配置“縮寫”
實際測試下來,必須要指定“縮寫”檬姥,否則無法獲取databaseId
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql" />
<property name="H2" value="h2" />
</databaseIdProvider>

映射文件檢測databaseId
<if test="_databaseId == 'h2'">

可在Configuration中獲取當(dāng)前數(shù)據(jù)庫廠商標識
String databaseId = sqlSession.getConfiguration().getDatabaseId();

13.批量更新
有兩種批量更新方式
一種用動態(tài)sql中的foreach標簽曾我,拼接sql
一種用openSession(ExecutorType.BATCH)指定批量更新模式
實際測試下來,對于性能僅有小幅提升

14.自定義類型處理器
可擴展接口健民,或繼承自BaseTypeHandler抒巢,實現(xiàn)自定義讀寫方法
并在配置文件中配置

15.枚舉處理
類似于自定義類型處理器
內(nèi)置了兩個實現(xiàn)類
EnumTypeHandler在數(shù)據(jù)庫中存儲枚舉的字符值
EnumOrdinalTypeHandler存儲枚舉的索引值

16.插件
插件實現(xiàn)Interceptor接口,用注解標記攔截方法秉犹,并在配置文件中注冊插件
其中intercept方法是主體功能所在方法
plugin方法虐秦,用于多個插件按序調(diào)用,一般如下寫死
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
setProperties方法凤优,從配置文件中獲取參數(shù)悦陋,然后存入類字段中

17.二級緩存
確保配置文件中開啟二級緩存
<setting name="cacheEnabled" value="true" />

映射文件中
<cache />
如果只是最簡單的內(nèi)存緩存,可用僅僅寫一個cach標簽
自定義實現(xiàn)類筑辨,需指定type屬性

18.redis作為二級緩存
官方提供了mybatis-redis庫俺驶,在maven2下可用
在classpath下新建redis.properties,配置redis連接
映射文件中配置<cache type="org.mybatis.caches.redis.RedisCache" />
具體參考http://www.mybatis.org/redis-cache/index.html

x.和spring集成
仍然可以在spring中配置mybatis的配置文件,但是數(shù)據(jù)源暮现,事務(wù)还绘,映射文件一般都在spring中配置

mybatis和mybatis-sprin的類庫版本要匹配,最好都用最新的穩(wěn)定版本

因為掃描映射類(Mapper類)處于spring加載的時期栖袋,會導(dǎo)致自動映射properties特性失效拍顷。一般改為延遲加載,指定sqlSessionFactoryBeanName而非sqlSessionFactoryBean塘幅。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- configLocation:用于指定Mybatis的配置文件位置 -->
    <property name="configLocation" value="classpath:mybatis-config-spring.xml"></property>
    <!-- 指定映射文件 -->
    <property name="mapperLocations" value="classpath*:mapper/**/*.xml"></property>
</bean>

<!-- 尋找Mapper類(Dao類) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.dao" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>


@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource());
    sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config-spring.xml"));
    sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/**/*.xml"));
    return sqlSessionFactoryBean.getObject();
}

@Bean
public MapperScannerConfigurer getMapperScannerConfigurer() {
    MapperScannerConfigurer configurer = new MapperScannerConfigurer();
    configurer.setBasePackage("com.dao");
    configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
    return configurer;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昔案,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子电媳,更是在濱河造成了極大的恐慌踏揣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾乓,死亡現(xiàn)場離奇詭異捞稿,居然都是意外死亡,警方通過查閱死者的電腦和手機拼缝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門娱局,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咧七,你說我怎么就攤上這事铃辖。” “怎么了猪叙?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵娇斩,是天一觀的道長。 經(jīng)常有香客問我穴翩,道長犬第,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任芒帕,我火速辦了婚禮歉嗓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘背蟆。我一直安慰自己鉴分,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布带膀。 她就那樣靜靜地躺著志珍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垛叨。 梳的紋絲不亂的頭發(fā)上伦糯,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音,去河邊找鬼敛纲。 笑死喂击,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淤翔。 我是一名探鬼主播翰绊,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旁壮!你這毒婦竟也來了监嗜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寡具,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稚补,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體童叠,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年课幕,在試婚紗的時候發(fā)現(xiàn)自己被綠了厦坛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乍惊,死狀恐怖杜秸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情润绎,我是刑警寧澤撬碟,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站莉撇,受9級特大地震影響呢蛤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棍郎,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一其障、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涂佃,春花似錦励翼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伯病,卻和暖如春殊橙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工膨蛮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叠纹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓敞葛,卻偏偏與公主長得像誉察,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惹谐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 官方文檔 簡介 入門 XML配置 XML映射文件 動態(tài)SQL Java API SQL語句構(gòu)建器 日志 一持偏、 JD...
    拾壹北閱讀 3,544評論 0 52
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL氨肌、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,520評論 0 4
  • 《深入淺出MyBatis技術(shù)原理與實戰(zhàn)》2016年版本 讀書筆記 第一章 MyBatis簡介 1.ORM模型:對象...
    GunnerAha閱讀 550評論 0 3
  • 參考書籍 原著:Java Persistence with MyBatis 3. 作者:K.Siva Prasad...
    LOOK_LOOK閱讀 541評論 0 0
  • 一年一度的10.1又來了鸿秆,父親一個星期前就開始采購,買了鱸魚怎囚,又覺得清蒸不是他的拿手絕活卿叽,返回頭又跑到離家很遠的超...
    賢無閱讀 231評論 2 2