1. 程式人生 > >Mybatis學習筆記(3)之高階功能

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學習筆記3Ajax下

二. 請求伺服器資料 前面介紹的是如何在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 學習筆記3procedure 賦值

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學習系列3url

ref htm 學習 pri blank url lan get 系列 bfzwjeqjSpriNgMc學習系列(3)之url χ絳 bfzwjeqjSpriNgMc學習系列(3)之urlbfzwjeqjSpriNgMc學習系列(3)之url

TCP/IP詳解學習筆記3IP協議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學習筆記(八)之運算符