Mybatis學習筆記(3)之高階功能
高階功能
對映關係
一對一對映
SQL語句:使用者訂單查詢
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
resultType方法
1. 定義pojo物件
由於原始的Orders.java不能對映全部欄位,所以需要新建立的pojo。如下:
2. 在mapper.xml相應的sql語句配置中,輸出型別為上邊定義的pojo物件。其他照舊。
resultMap
1. 思路:
1) 使用resultMap將查詢結果中的訂單資訊對映到Orders物件中。
2) 在orders類中新增User屬性,將關聯查詢出來的使用者資訊對映到orders物件中的user屬性中。
2. 方法:
1) 在主表對應類中新增關聯表對應的物件
2) 在mapper.xml中定義resultMap
3) Sql語句的配置
一對多對映
Sql語句:使用者訂單及訂單明細
SELECT
orders.*,
USER.username,
USER.sex,
USER.address,
orderdetail.idorderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
FROM
orders,
USER,
orderdetail
WHERE orders.user_id = user.id ANDorderdetail.orders_id=orders.id
resultMap方法
1. 主表對應實體類中新增屬性:在orders.java類中新增List<orderDetail> orderDetails屬性。最終會將訂單資訊對映到orders中,訂單所對應的訂單明細對映到orders中的orderDetails屬性中
2. 定義resultMap
多對多對映
sql語句:由於使用者和商品沒有直接關聯,通過訂單和訂單明細進行關聯,所以關聯表:
orders、orderdetail、items
SELECT
orders.*,
USER.username,
USER.sex,
USER.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id,
items.name items_name,
items.detail items_detail,
items.price items_price
FROM
orders,
USER,
orderdetail,
items
WHERE orders.user_id = user.id ANDorderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
resultMap方法
1. 思路:將使用者資訊對映到user中。
1) 在user類中新增訂單列表屬性List<Orders> orderslist,將使用者建立的訂單對映到orderslist
2) 在Orders中新增訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細對映到orderdetials
3) 在OrderDetail中新增Items屬性,將訂單明細所對應的商品對映到Items
2. 定義resultMap
resultType與resultMap小結
resultType |
resultMap(常用) |
||
association |
collection |
||
作用 |
將查詢結果按照sql列名與pojo中屬性名,以一致性關係進行對映 |
將關聯查詢資訊對映到一個pojo物件中 |
將關聯查詢資訊對映到一個list集合中 |
場合 |
常見一些明細記錄的展示,比如使用者購買商品明細,將關聯查詢資訊全部展示在頁面時,此時可直接使用resultType將每一條記錄對映到pojo中,在前端頁面遍歷list(list中是pojo)即可 |
為了方便查詢關聯資訊可以使用association將關聯訂單資訊對映為使用者物件的pojo屬性中,比如:查詢訂單及關聯使用者資訊。 |
為了方便查詢遍歷關聯資訊可以使用collection將關聯資訊對映到list集合中 |
延遲載入 |
不可 |
可以 |
延遲載入
1. 延遲載入:先從單表查詢、需要時再從關聯表去關聯查詢,大大提高 資料庫效能,因為查詢單表要比關聯查詢多張錶速度要快。
使用association實現延遲載入(同Collection)
1. Sql語句:
Select order.*,
(select username from user where orders.user_id = user.id)username
(select sex from user whereorders.user_id = user.id)sex
from orders
2. 目的:
1) 首先載入orders表中的滿足orders.user_id = user.id條件的user_id。
2) 然後在需要時載入User表中orders.user_id = user.id項中的username和sex。
3. 方法:
1) 在SqlMapConfig.xml開啟延遲載入
2) 將上面的sql語句拆分成兩個statement,即:
SELECT * FROMorders
3) 關聯查詢使用者資訊,通過上邊查詢到的訂單資訊中user_id去關聯查詢使用者資訊。
4) 將這兩個statement通過resultMap關聯起來:上邊先去執行findOrdersUserLazyLoading,當需要去查詢使用者的時候再去執行findUserById。配置延遲載入的resultMap。
5) 小結:關係圖如下
查詢快取
Mybatis快取模型
1. 一級快取是SqlSession級別的快取。不同的sqlSession之間的快取資料區域(HashMap)是互相不影響的,預設自動開啟。
2. 二級快取是mapper的名稱空間級別的快取,一個名稱空間對應一個二級快取。多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級快取,二級快取是跨SqlSession的
一級快取
原理
1. 第一次發起查詢使用者id為1的使用者資訊,先去找快取中是否有id為1的使用者資訊,如果沒有,從資料庫查詢使用者資訊。得到使用者資訊,將使用者資訊儲存到一級快取中。
2. 第二次發起查詢使用者id為1的使用者資訊,先去找快取中是否有id為1的使用者資訊,快取中有,直接從快取中獲取使用者資訊。
3. 如果sqlSession去執行commit操作(執行插入、更新、刪除),清空SqlSession中的一級快取,這樣做的目的為了讓快取中儲存的是最新的資訊,避免髒讀。
二級快取
原理
使用方法
1. 在Mybatis的全域性配置檔案中(SqlMapconfig.xml檔案)開啟開啟二級快取。
2. 在mapper.xml對映檔案中開啟二級快取
3. 對需要快取的pojo實體類物件實現序列化,這是因為二級快取資料儲存介質多種多樣,為了將快取資料取出執行反序列化操作。
二級快取常用標籤設定
1. useCache配置:在statement中設定useCache=false可以禁用當前select語句的二級快取。針對每次查詢都需要最新的資料sql,要設定成useCache=false,禁用二級快取。
<selectid="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
2. 重新整理快取(清空快取):設定statement配置中的flushCache="true" 屬性,預設情況下為true即重新整理快取。一般下執行完commit操作都需要重新整理快取,flushCache=true表示重新整理快取,這樣可以避免資料庫髒讀。(一般無需特別設定)
<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User" flushCache="true">
Mybatis整合ehcache
分散式快取
1. 優點:快取的資料在各各服務單獨儲存,不方便系統開發,使用分散式快取對快取資料進行集中管理。
整合方法
mybatis無法實現分散式快取,需要和其它分散式快取框架進行整合。
1. 實質:mybatis提供了一個cache介面,如果要實現自己的快取邏輯,實現cache介面開發即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一個cache介面的實現類。
2. 與ehcache整合步驟
1) 匯入ehcache包
2) 加入ehcache的配置檔案:在classpath下配置ehcache.xml
3) 配置mapper中cache中的type為ehcache對cache介面的實現型別
Spring和Mybatis整合
整合的內容
1. 需要spring通過單例方式管理SqlSessionFactory。
2. spring和mybatis整合生成代理物件,使用SqlSessionFactory建立SqlSession。(spring和mybatis整合自動完成)。
3. 持久層的mapper都需要由spring進行管理。
整合方法
1. 建立整合環境
2. 在spring中配置SQLSessionFactory:(applicationConfig.xml)
3. spring管理mapper的代理物件,即將mapper的代理物件注入的spring容器中
1) 遵循規範:將mapper.java和mapper.xml對映檔名稱保持一致,且在一個目錄中。
2) 自動掃描出來的bean 的id為mapper類名,首字母小寫。
3) Mybatis掃描包與Spring掃描包的關係
相關推薦
Mybatis學習筆記(3)之高階功能
高階功能 對映關係 一對一對映 SQL語句:使用者訂單查詢 SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = u
mybatis學習筆記(二)之XML方式的基本用法
在前一篇筆記中,我們建立了配置 mybatis-config.xml 檔案,原來 mappers標籤下的內容為: <mappers> <mapper resource="tk/mybatis/simple/mapper/CountryMa
mybatis學習筆記(一)之檔案配置
通過 http://mvnrepository.com/ 可以查詢pom.xml檔案的依賴座標 1,、mybatis的 pom.xml 檔案大概依賴如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:
jQuery學習筆記(3)之Ajax下
二. 請求伺服器資料 前面介紹的是如何在HTML頁面中載入非同步資料的方法,即如何從伺服器上取得靜態的資料。但頁面的應用遠不僅侷限於此,Ajax技術最終體現在與伺服器的動態資料實現人機互動中,即客戶端傳遞帶有引數的請求,伺服器接收後,分析所傳遞來的請求,並做出相應的響應,傳送對應資料至客
MyBatis學習筆記(3)---動態sql語句
通過mybatis提供的各種標籤方法實現動態拼接sql 1、if標籤 <!-- 根據條件查詢使用者 --> <select id="queryUserByWhere" param
myBatis學習筆記(3)——實體屬性名與表字段名不匹配問題
問題 <select id="getUser" parameterType="String" resultType="User"> select
oracle procedure 學習筆記(3)procedure 之賦值
create or replace procedure procedureName( parameterName in parameterType,-- in 為傳入引數 outMessage out parameterType -- out 為輸出引數 ) as/
MyBatis學習筆記(四)mybatis-config.xml都有哪些配置之環境配置與對映器
環境配置(environments),其中還可以配置事物,專案中大概也不會用到。 <environments default="development"> <environment id="development"> <t
MyBatis學習筆記(三)mybatis-config.xml都有哪些配置之typeAliases與plugins
類型別名(typeAlicases) 在mybatis-config.xml配置檔案中加入類描述 <typeAliases> <typeAlias type="org.mybatis.example.User" alias="User" />
bfzwjeqjSpriNgMc學習系列(3)之url
ref htm 學習 pri blank url lan get 系列 bfzwjeqjSpriNgMc學習系列(3)之url χ絳 bfzwjeqjSpriNgMc學習系列(3)之urlbfzwjeqjSpriNgMc學習系列(3)之url
TCP/IP詳解學習筆記(3)IP協議ARP協議和RARP協議
out 處理機 傳輸 包含 發送 res 這也 進行 默認 把這三個協議放到一起學習是因為這三個協議處於同一層,ARP協議用來找到目標主機的Ethernet網卡Mac地址,IP則承載要發送的消息。數據鏈路層可以從ARP得到數據的傳送信息,而從IP得到要傳輸的數據信息。
myBatis學習筆記(10)——使用攔截器實現分頁查詢
條件 iba execute rri itl alias property gen func 1. Page package com.sm.model; import java.util.List; public class Page<T&g
spring學習筆記(3)——bean配置細節註意
collect 1.5 之前 ice ble person name return 引用 1. 一個bean引用另外一個bean 當Person類中有一個屬性是Car,那麽該如何配置呢 person: package com.zj.spring; public class
QT學習筆記(3) 我的第一個程序
9.png har 中文 gets 有一個 setw 通過 坐標 關系 今天,學習搭建一個空項目,了解程序是如何運行的。 (1)新建一個空項目 1、在創建完空項目之後,項目中只有一個空的項目文件( .pro) 2、然後需要在項目文件(.pro)中添加:
Hibernate學習筆記(3)---hibernate關聯關系映射
gen -m type foreign out eas ner 機制 路徑 一對一關聯 假設有兩個持久化類(實體類)User與Address,它們之間存在一對一的關系 1,通過主鍵關聯(個人偏向另外一種) User.hbm.xml文件配置 <id name="u
C++深度解析教程學習筆記(3)函數的擴展
插入 分享 技術 lsp 預處理器 _for 返回 忽略 結合 1.內聯函數 1.1.常量與宏的回顧 (1)C++中的 const 常量可以替代宏常數定義,如: const int A = 3; //等價於 #define A 3 (2)C++中是否有解決方案,可以用來
Jest 學習筆記(一)之matchers
react 使用 babel 不能 文件夾 fin 控制 -- scripts Jest官網地址: https://facebook.github.io/jest/ Jest是專門被facebook用於測試包括React應用在內的所有javascript代碼,J
python學習筆記(六)之集合1
什麽 mos pty this ash 筆記 sca sel 指定 python學習筆記(六)之集合1python中各種類型與其各種方法,都可以使用下面的方法查到:(1)交互模式下用dir()或者help()(2)google集合特點:英語set,有的可變,有的不可變;元素
python學習筆記(六)之集合2
lock true 可變 對象 屬於 attribute 聯盟 per rec python學習筆記(七)之集合2不變的集合在”python學習筆記(六)之集合1“中以set()來建立集合,這種方式所創建的集合都是可原地修改的集合,或者說是可變的,也就是說是unhashab
python學習筆記(八)之運算符
技術 ima 學習 表達式 water nag proc 說明 ddc python學習筆記(八)之運算符 算術運算符 比較運算符 邏輯運算符(1)布爾運算(2)復雜的布爾表達式 說明:以上內容摘自《跟老齊學python》python學習筆記(八)之運算符