MyBatis是一款優秀的支持自定義SQL查詢,存儲過程和高級映射的持久層框架,消除了幾乎全部的JDBC代碼和參數的手動設置以及結果集的檢索。MyBatis可使用XML或註解進行配置和映射,MyBatis經過將參數映射到配置的SQL造成最終執行的SQL語句,最後將執行SQL的結果映射成Java對象返回。
MyBatis支持聲明式數據緩存(declarative data caching).當一條SQL語句被標記爲「可緩存」後,首次執行它時從數據庫獲取的全部數據會被存儲在高速緩存中,後面再執行這條語句時就會從高速緩存中讀取結果,而不是再次命中數據庫。MyBatis提供了默認狀況下基於Java HashMap的緩存實現(一級緩存),以及用於與OSCache,Ehcache,Hazelcast 和 Memcached鏈接的默認鏈接器,同時還提供了API供其餘緩存實現使用。
MyBatis提供查詢緩存,用於減輕數據壓力,提升數據庫性能。MyBatis提供一級緩存和二級緩存。
一級緩存是SqlSession級別的緩存。在操做數據庫時須要構造sqlSession對象,在對象中有一個(內存區域HashMap)數據結構用於存儲緩存數據。不一樣的SqlSession之間的緩存數據區域是互相不影響的。一級緩存的做用因而同一個SqlSession,在同一個SqlSession中兩次執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將再也不從數據庫查詢,從而提升查詢效率。當一個sqlSession結束後該sqlSession中的一級緩存也就不存在了。MyBatis默認開啓一級緩存。
二級緩存是mapper級別的緩存,多個SqlSession去操做同一個Mapper的sql語句,多個SqlSession去操做數據庫獲得數據會存在二級緩存區域,多個SqlSession能夠共用二級緩存,二級緩存是跨SqlSession的。二級緩存是多個SqlSession共享的,器做用域是mapper的同一個namespace,不一樣的SqlSession兩次執行相同namespace下的sql語句且向sql中傳遞參數也相同即最終執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存,第二次會從緩存中獲取數據將再也不從數據庫中查詢,從而提升查詢效率。Mybatis默認沒有開啓二級緩存,須要在手動開啓二級緩存。
MyBatis中,關於數據庫字段和Java類型的對應關係。因爲Java中的基本數據類型會有默認值,例如當某個類中存在private int age;字段時,建立這個類時,age會有默認值0.當使用age屬性時,它總會有值。所以在某些狀況下,便沒法實現使age爲null。而且在動態SQL的部分,若是使用age != null進行判斷,結果總會爲true,於是會致使不少隱藏的問題。因此,在實體類中不要使用基本數據類型。
MyBatis名稱映射規則:
能夠經過在resultMap中配置property屬性和column屬性的映射,或者在SQL中設置別名這兩種方式實現將查詢列映射到對象屬性的目的。
property屬性或別名要和對象中屬性的名字相同,可是實際匹配時,MyBatis會先將二者都轉換爲大寫形式,而後在判斷是否相同,即property="userName" 和 property="username"均可以匹配到對象的userName屬性上。判斷是否相同的時候要使用USERNAME,所以在設置property屬性或別名的時候,不須要考慮大小寫是否一致,可是爲了便於閱讀,要儘量按照統一的規則來設置。
在數據庫中,因爲大多數數據庫設置不區分大小寫,所以下劃線方式的命名很常見,如user_name, user_email。在Java中,通常都使用駝峯式命名,若是userName,userEmail。所以MyBatis還提供了一個全局屬性mapUnderscoreToCamelCase,經過配置這個屬性爲true能夠自動將如下劃線方式命名的數據庫列映射到Java對象的駝峯式命名屬性中。這個屬性默認是false,須要手動打開。
mapper.xml中 parameterType屬性:即將傳入的語句參數的徹底限定類名或別名。這個屬性是可選的,由於MyBatis能夠推斷出傳入語句的具體參數,所以不建議配置該屬性。
在SQL語句中,爲了防止類型錯誤,對於一些特殊的數據類型,建議指定具體的jdbcType值。例如頭像圖片 指定 BLOB類型, 時間類型指定TIMESTAMP.BLOB對應的類型是ByteArrayInputStream,就是二進制數據流。因爲數據庫區分date,time,datetime類型,可是Java中通常都使用java.util.Date類型。所以爲了保證數據類型的正確,須要手動指定日期類型,date,time,datetime對應的JDBC類型分別爲DATE,TIME,TIMESTAMP
insert須要注意的是新建的對象插入數據庫中,返回值是執行的SQL影響的行數。而不是插入對象的id。