首先Mybatis是一個對象關系映射(Object Relational Mapping,簡稱ORM)框架,是為了解決面向對象與關系數據庫存在的互不匹配的現象。也就是說Mybatis的關注點在於對象與數據庫之間的映射,Mybatis會把從數據庫中得到的松散數據進行封裝,使開發者直接拿到一個對象。Mybatis其實是對jdbc的操作數據庫的過程進行了封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如注冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼。
Mybatis需要手寫Sql語句,對jdbc的封裝程度不如hibernate,但因此也靈活得多。
在使用mybatis時,只需要關注三個部分(1.sql語句 2.輸入參數 3.輸出參數)
輸入參數映射->sql語句中的占位符
1.輸入參數可以是基本類型
如果只有一個參數那么可以不使用@Param注解,但如果有多個參數,必須使用@Param注解,用於映射參數->占位符。
2.也可以是pojo類型,但如果是pojo類型,那么pojo中的屬性必須與sql語句中的占位符一樣
例如上圖,那么User類中必須有name和id這兩個屬性名。否則會報Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'name2' in 'class me.gacl.domain.User'的錯誤。(從異常上也可以看出使用到了反射)
3.還可以這樣使用pojo類型
輸出參數映射->數據庫表中的字段
輸出參數一般的類型都是pojo或者是list<pojo>類型。(即一對一或者一對多的關系)
一般要求是pojo中的屬性名要和數據庫表中的字段一樣才能完成映射(但是也可以通過別的方式完成映射,具體方法可以參考Mybatis 字段映射問題.note)。
如果查詢出來的列名和pojo中的屬性名全部不一致,不會創建pojo對象。
只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象,但其他屬性值為默認值。
輸入映射:
parameterType:指定輸入參數類型可以簡單類型、pojo、hashmap。
對於綜合查詢,建議parameterType使用包裝的pojo,有利於系統 擴展。
輸出映射:
resultType:
查詢到的列名和resultType指定的pojo的屬性名一致,才能映射成功。(使用了反射機制,屬性名和列名不一致就無法通過反射找到setter方法)
reusltMap:
可以通過resultMap 完成一些高級映射。
如果查詢到的列名和映射的pojo的屬性名不一致時,通過resultMap設置列名和屬性名之間的對應關系(映射關系)。可以完成映射。
高級映射:
將關聯查詢的列映射到一個pojo屬性中。(一對一)
將關聯查詢的列映射到一個List<pojo>中。(一對多)