Mybatis配置文件
映射文件
配置文件和映射文件還有挺多的屬性我還沒有講的,現在就把它們一一補全
在mapper.xml文件中配置很多的sql語句,執行每個sql語句時,封裝為MappedStatement對象,mapper.xml以statement為單位管理sql語句
Statement的實際位置就等於namespace+StatementId
佔位符
在Mybatis中,有兩種佔位符
#{}解析傳遞進來的參數數據
${}對傳遞進來的參數原樣拼接在SQL中
主鍵生成策略
如果我們在Hibernate中,當我們插入數據的時候,我們是可以選擇是UUID策略的…
那麼在Mybatis是怎麼做的呢??
UUID
主鍵返回
如果我們一般插入數據的話,如果我們想要知道剛剛插入的數據的主鍵是多少,我們可以通過以下的方式來獲取
需求:
user對象插入到資料庫後,新記錄的主鍵要通過user對象返回,通過user獲取主鍵值。
解決思路:
通過LAST_INSERT_ID()獲取剛插入記錄的自增主鍵值,在insert語句執行後,執行select LAST_INSERT_ID()就可以獲取自增主鍵。
mysql:
oracle:
實現思路:
先查詢序列得到主鍵,將主鍵設置到user對象中,將user對象插入資料庫。
resultMap
有的時候,我們看別的映射文件,可能看不到以下這麼一段代碼:
因為,如果我們的數據表的欄位和JavaBean的屬性名稱是相同時,我們就不用上面那段代碼了。Mybatis會自動幫我們把返回的結果進行封裝成JavaBean
那當我們數據表的欄位和JavaBean的屬性名稱不是相同時,我們就需要使用resultMap,也就是上面那段代碼
當然了,在正常情況下列名和JavaBean的屬性名一般都是不同的,因此還是需要resultMap的。
resultMap和resultType區別
resultType :指定輸出結果的類型(pojo、簡單類型、hashmap..),將sql查詢結果映射為java對象 。
使用resultType注意:sql查詢的列名要和resultType指定pojo的屬性名相同,指定相同 屬性方可映射成功,如果sql查詢的列名要和resultType指定pojo的屬性名全部不相同,list中無法創建pojo對象的。
resultMap:將sql查詢結果映射為java對象。
如果sql查詢列名和最終要映射的pojo的屬性名不一致,使用resultMap將列名和pojo的屬性名做一個對應關係 (列名和屬性名映射配置)
使用resultMap
這裡寫圖片描述
這裡寫圖片描述
resultType和resultMap用法總結
resultType:
作用:
將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。
場合:
常見一些明細記錄的展示,將關聯查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。
resultMap:
使用association和collection完成一對一和一對多高級映射。
association:
作用:
將關聯查詢信息映射到一個pojo類中。
場合:
為了方便獲取關聯信息可以使用association將關聯訂單映射為pojo,比如:查詢訂單及關聯用戶信息。
collection:
作用:
將關聯查詢信息映射到一個list集合中。
場合:
為了方便獲取關聯信息可以使用collection將關聯信息映射到list集合中,比如:查詢用戶許可權範圍模塊和功能,可使用collection將模塊和功能列表映射到list中。
Collection在前面好像並沒有用過,下面就看一下它的用法:
Order與OrderDetails關係
SQL語句
resultMap
一般地使用resultMap會多一點。
Mybatis映射文件處理特殊字元
第一種方法:
用了轉義字元把>和
SELECT * FROM test WHERE 1 = 1 AND start_date = CURRENT_DATE
第二種方法:
配置文件
別名
typeAliases別名:
這裡寫圖片描述
自定義別名:
Mapper載入
延遲載入
在進行數據查詢時,為了提高資料庫查詢性能,盡量使用單表查詢,因為單表查詢比多表關聯查詢速度要快。
如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關聯信息時,再關聯查詢,當需要關聯信息再查詢這個叫延遲載入。
在Mybatis中延遲載入就是在resultMap中配置具體的延遲載入..
這裡寫圖片描述
在Mybatis的文件中配置全局延遲載入
延遲載入測試
當需要用戶時調用 Orders類中的getUser()方法執行延遲載入 ,向資料庫發出sql。
由於是對User進行延遲載入,那麼我們只要查詢Orders相關的信息即可了
使用resultMap來配置延遲載入
這裡寫圖片描述
總結
在程序中調用的SQL語句是由映射文件的命令空間+sql片段的id所組成的。它內部會生成一個Statement對象的。
在使用別名的時候,可以指定包名,在使用總配置文件載入映射文件時,也可以指定包名。
主鍵如果需要返回的話,使用selectKey 標籤即可。UUID也可以返回。在Oracle的話,是使用序列來返回自動增長的主鍵的。
佔位符有兩種,一種是解析傳遞進來的參數數據、一種是原樣輸出傳遞進來的數據。
TAG:Java3y |