[TOC]java
前言
- 映射器以前咱們已經提到了,是mybatis特有的組件: java+xml組合的方式。對於Java類和xml的編寫也很簡單。值得注意的是須要將Java編寫的mapper註冊到mybatis中來。以前的註冊的方式經過xml。到後續經過spirng來管理經過@Mapper就很方便了。
標籤
- Java實現的接口Mapper很簡單,就是已接口的形式暴露,方法和參數和咱們正常的寫同樣,就是在多參數的時候咱們須要經過
@Param
註解標註在sql中的變量名。
-
- 可是xml就須要按照mybatis的格式來寫了。xml中有select、insert、update、delete等對應方法的標籤。除了這些還有sql、resultMap、
select
- 嚴格來講,select及下面的insert這些都有一個id,這些id造成JavaMapper中對應的方法。mybatis也是經過id來定位到要執行的sql的。咱們經過parameterType、resultType定義入參和出參的類型。Type也能夠事先定義爲對應的Map 即 parameterMap、resultMap。 在select標籤中還有一個flushCache用來表示是否清楚緩存在查詢。由於mybatis默認對SESSION級別開啓一級緩存。還有以前提到的fetchSize獲取記錄的條數。常見的就這些屬性。還有其餘屬性感興趣的能夠深刻
- 在入參出參的時候咱們可使用別名來制定類型。這就是別名帶來的好處。不須要寫一大長串的包名類名。
- 在第一張咱們就提到mybatis和Hibernate的區別是前者是半自動後者是全自動。半自動映射是由於mybatis在列明和屬性名相同的時候自動映射,剩下的就須要咱們sql別名了。mybatis還提供一種列名轉駝峯映射的方式也是常用的。
- select中常常會用到resultMap, resultMap這個標籤用途能夠說是跟大。首先定義Javabean屬性和數據庫列的映射。映射包括一對一,一對多,還有根據狀況選擇器這三種特殊標籤。初次以外在列與屬性映射時候還能夠指定TypeHandler來進行覆蓋。有機會好好總結一下這個resultMap。
insert|update|delete
- 這些標籤實際上和select標籤同樣。屬性上也都是差很少。不一樣的是select有結果集。而這三個標籤返回的就是記錄數。並不注重他們的返回,更加註重的是他們的入參的執行。常常在他們裏面會有foreach這些用來批量操做。
- 在新增的時候mybatis提供selectKey標籤來實現主鍵自增加策略,也能夠實現自定義主鍵增加策略。這裏的增加並非數字層面的增加,而是不一樣的意思。
參數
- 在傳參的方式有不少種,咱們能夠選擇map ,也能夠選擇javabean,也能夠多參傳遞。多參傳遞的時候咱們須要添加
@Param
註解標註屬性名。根據實際狀況自行選取哪一種方式。
- 上面提到resultMap能夠指定typeHandler,實際上在參數上咱們也能夠。#{name,javaType=double,jdvbType=NUMERIC,typeHandler=MyTypeHandler}
- #{name} 這種方式mybatis會自動根據數據格式進行映射,可是當name爲null,mybatis就沒法映射,這個時候咱們#{name,jdbcType=VARCHAR}。mybatis就會採用StringTypeHandler去解析
- 還有就是# ,$ 的區別。這裏很少說,前者是佔位,後者是拼接
resultMap
- resultMap是最複雜的一個標籤,他的功能能夠實現字段的映射、級聯的查詢、定製類型轉換器。resultMap目前只能用在select標籤中。新增沒有。
<resultMap>
<constructor>
<idArg/>
<arg/>
</constructor>
<id/>
<result/>
<association/>
<discriminator/>
</resultMap>
## 級聯
- 級聯在咱們平時開發中是最多見的。咱們經過pojo接收返回結果的時候咱們常常須要處理的就是級聯的問題。在上面的resultMap中經過association、collection來負責一對一。一對多的處理。具體的級聯在我以前的文章中都有的。你們能夠關注我查看。
cache
- 緩存是爲了提升運行效率產生的一個功能。主要就是講數據保存 在內存中。由於cpu讀取內存是很是的快的。因此緩存可以提升咱們的效率。以前咱們已經提過了,mybatis爲咱們提供兩種緩存。一級緩存和二級緩存。一級緩存默認是打開的。他的生命週期是SESSION。就是說在同一個sqlsession中相同的查詢是通過緩存的。這個緩存若是沒有在insert或者select其餘標籤內沒有flush緩存的話,這個緩存在規定時間內就會一直存在。換句話說一樣的sql將會一直查詢緩存。上述狀況僅僅是針對相同的sqlsession.
- 一級緩存針對sqlsession。有的時候咱們須要講mapper進行緩存。換句話說講緩存放到sqlsessionfactory上。這時候咱們引入了二級緩存的概念。mybatis默認是不開啓二級緩存的。開啓的方式也很簡單
<cache/>
- 只須要在mybatis-config.xml中加入cache這個標籤就能夠了。固然咱們若是是用pojo接收結果的。pojo須要進行序列化。
- 在二級緩存中咱們全部的select都講被緩存起來。在insert、update、delete執行的時候都將會刷新緩存的。下面給出一個全的cache配合。
<cache eviction="LRU" flushInterval="1000" size="1024" readOnly="true"/>
自定義緩存
- 咱們上面開啓的只是mybatis爲咱們提供的二級緩存。可是每每咱們都是結合redis這種第三方緩存實現的。下面咱們來看看咱們如何實現自定義緩存。
-
- 首先咱們須要先繼承
org.apache.ibatis.cache.Cache
接口。而後經過在mybatis-config.xml中引入咱們的類就好了
-
<cache type="*******"/>
每每在select、insert、update、delete這些標籤中和userCache、flushCache結合使用實現緩存的使用的sql
-
加入戰隊redis
<span id="addMe">加入戰隊</span>
微信公衆號
