mybatis (高階對映 快取 延遲載入)
1 一對一查詢對映的pojo
建立pojo包括 訂單資訊和使用者資訊,resultType才可以完成對映。
一個訂單對應一個使用者 因此在訂單實體類中 我們應該加入一個使用者屬性 實體類如下:
public class Order { private Integer orid; private Integer userid; private Double ordermoney; private User user; }
接下來 我們該在mapper.xml中利用(resultMap 和association 標籤配置User)
<resultMap type="com.login.entity.Order" id="userAndOrder"> <result property="orid" column="order_id" /> <result property="userid" column="user_id"/> <result property="ordermoney" column="order_money"/> <association property="user" javaType="com.login.entity.User"> <result property="username" column="user_name"/> <result property="userpwd" column="user_pwd"/> <result property="userphone" column="user_phone"/> </association> </resultMap> <select id="findOrderAndUserById" resultMap="userAndOrder"> SELECT * FROM qxglxt.order orde JOIN qxglxt.user u ON orde.user_id=u.user_id where u.user_id=2 </select>
測試:
public static void main(String[] args) { try { Reader reader=Resources.getResourceAsReader("SqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession=sqlSessionFactory.openSession(); //訂單 OrderMapper orderMapper=sqlSession.getMapper(OrderMapper.class); Order ord=orderMapper.findOrderById(1);
2 一對多查詢對映的pojo
建立pojo包括 訂單資訊和使用者資訊,resultType才可以完成對映。
一個使用者應該有多個訂單 因此在使用者實體類中我們應該加入List<Order> list 屬性 實體類如下:
public class User {
private String username;
private String userpwd;
private String userphone;
private List<Order> list;
}
接下來 我們該在mapper.xml中利用(resultMap 和connection 標籤配置list)
<resultMap type="com.login.entity.User" id="uid"> <result property="username" column="user_name"/> <result property="userpwd" column="user_pwd"/> <result property="userphone" column="user_phone"/> <collection property="list" ofType="com.login.entity.Order"> <result property="orid" column="order_id" /> <result property="userid" column="user_id"/> <result property="ordermoney" column="order_money"/> </collection> <!-- 名字不一樣必須配置 名字一樣 可以不配的 --> </resultMap> <select id="findUserById" resultMap="uid"> select * from user where user_id=#{id} </select>
一對一的xml配置詳細介紹:
private User user;
一對多的xml配置詳細介紹:
private List<Order> list;
3 延遲載入
·在進行資料查詢時,為了提高資料庫查詢效能,儘量使用單表查詢,因為單表查詢比多表關聯查詢速度要快。如果查詢單表就可以滿足需求,一開始先查詢單表,當需要關聯資訊時,再關聯查詢,當需要關聯資訊再查詢這個叫延遲載入。
mybatis中resultMap提供延遲載入功能,通過resultMap配置延遲載入。
例子 : 當查詢一個訂單時 如果沒有點選訂單詳情的東西 就只需要將訂單表中的資訊顯示出來 而訂單詳情的東西則等到呼叫的時候再顯示
首先應該配置核心xml SqlMapConfig.xml 開啟延遲載入
<!-- 全域性配置引數 --> <settings> <!-- 延遲載入總開關 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 設定按需載入 如果存在多個懶載入 就是說 訂單中有使用者 使用者中有地址 那麼如果設定為true 就會在載入使用者的時候吧使用者的地址也給載入了 如果為false 就是使用到才載入 --> <setting name="aggressiveLazyLoading" value="false" /> </settings>
需求:
查詢訂單及使用者的資訊,一對一查詢。剛開始只查詢訂單資訊,當需要使用者時呼叫 Orders類中的getUser()方法執行延遲載入 ,向資料庫發出sql。
mapper.xml
resultMap
findUserByid 方法: user_id (關聯欄位)
<select id="findOrderAndUserById" resultMap="userAndOrder">
SELECT * FROM qxglxt.order orde JOIN qxglxt.user u ON orde.user_id=u.user_id where u.user_id=2
</select>
mapper.java
測試程式碼
4 快取
正如大多數持久層框架一樣,MyBatis 同樣提供了一級快取和二級快取的支援
- mybatis的一級快取是指SqlSession。一級快取的作用域是一個SqlSession。Mybatis預設開啟一級快取。
2.Mybatis的二級快取是指mapper對映檔案。二級快取的作用域是同一個namespace下的mapper對映檔案內容,多個SqlSession共享。Mybatis需要手動設定啟動二級快取。
如果把之前的sqlSession1.close()註釋掉,那麼同樣會執行兩次select*from users where user_id=2的SQL語句,因為sqlSession1沒有關閉,一級快取中的資料並沒寫入二級快取,
而sqlSession2又無法訪問sqlSession1的一級快取中的資料,所以會重新執行該查詢語句。
在執行增加,刪除,修改操作後必須要使用commit提交事務 。
3. 對於快取資料更新機制,當某一個作用域(一級快取Session/二級快取Namespaces)的進行了 C/U/D 操作後,預設該作用域下所有 select 中的快取將被clear。
相關推薦
mybatis (高階對映 快取 延遲載入)
1 一對一查詢對映的pojo 建立pojo包括 訂單資訊和使用者資訊,resultType才可以完成對映。 一個訂單對應一個使用者 因此在訂單實體類中 我們應該加入一個使用者屬性 實體類如下: public class Order { private Integer orid;
【EfF】 貪婪載入和延遲載入 (virtual去掉關閉延遲載入) EntityFramework(EF)貪婪載入和延遲載入的選擇和使用
EntityFramework(EF)貪婪載入和延遲載入的選擇和使用 貪婪載入:顧名思議就是把所有要載入的東西一 次性讀取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in context.Or
高階對映( 一對多 ,多對多 ,延遲載入)
<!-- 一對一查詢 --> <resultMap type="cn.labelnet.pojo.OperationCustionMap" id="operationClient"> <id column="id" property="id" /> <re
mybatis高階(3)_延遲載入_深度延遲_一級快取_二級快取
mybatis高階(3)_延遲載入_深度延遲_一級快取_二級快取 設定延遲載入需要在mybatis.xml中設定 注: 侵入式延遲載入為真時是延遲載入 侵入式延遲載入為假時是深度延遲載入 <!-- 延遲載入和深度延遲載入 --> <settings
(二十)Mybatis懶載入(延遲載入)
注:程式碼已託管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,專案是mybatis-16-lazyload,需要自取,需要配置maven環境以及mysql環境(sql語句在resource下的test.sql中),覺得有
MybatisDay02(批量generator、二級快取、延遲載入)
mybatis 高階對映 查詢快取 spring集合 mybatis是什麼? mbatis是一個持久層框架,mybatis是一個不完全的ORM框架,sql語句需要程式設計師自己去編寫,但是mybatis有對映(輸入引數對映、輸出結果對映) mybatis入門門檻不高,學習成本低,讓
EF 懶載入(延遲載入),預載入
定義一對多關係實體時,使用virtual和ICollection定義,實現eazyLoading 解析參考連結: https://docs.microsoft.com/zh-cn/ef/ef6/querying/related-data https://www.cnbl
多執行緒下單例模式:懶載入(延遲載入)和即時載入
前言 在開發中,如果某個例項的建立需要消耗很多系統資源,那麼我們通常會使用惰性載入機制,也就是說只有當使用到這個例項的時候才會建立這個例項,這個好處在單例模式中得到了廣泛應用。這個機制在single-threaded環境下的實現非常簡單,然而在multi-t
App啟動時三種效果(黑屏白屏、背景圖片、延遲載入)
最近做專案時,發現了一個問題: (1)有些應用點選後需要反應一會然後進入主頁如:微信、中國工商銀行 (2)有些應用點選後出來一個黑屏或白屏,閃一下然後進入主頁如:銀聯錢包 (3)有些應用點選後立刻出來
SSS框架整合no session(延遲載入)問題分析及解決
問題描述: 在做BOS物流管理系統的時候,點選區域頁面顯示配送區域資訊,這個時候後臺顯示了no session的錯誤org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationEx
Objective-C學習之懶載入(延遲載入)
簡介 懶載入——也稱為延遲載入,即在需要的時候才載入(效率低,佔用記憶體小)。所謂懶載入,寫的是其get方法. 注意:如果是懶載入的話則一定要注意先判斷是否已經有了,如果沒有那麼再去進行例項化 好處 使用懶載入的好處:
單例模式之懶漢模式(延遲載入)
什麼是延遲載入?延遲載入就是在呼叫get()方法時候建立,常見的方法就是在 get()中例項化。 看實現程式碼: package test; public class MyObject { private static MyObject myObject; pri
Fast Arrangement (線段樹,延遲標誌)
down station its pan tick 完全 ket one ger 個人心得:線段樹的延遲標誌確實是減少了很多時間,思想比較簡單,但是實現得時候和建立延遲的時候比較麻煩。 按照我的一些理解,就是更新時找到完全覆蓋的區間時,更新延遲標誌,不再往下更新,但此時父節
《SpringBoot從入門到放棄》之第(八)篇——SpringBoot整合Mybatis(大型專案開發技術首選)
一千個讀者有一千個哈姆雷特。 你們的專案中,傾向於把資料庫的語句寫在Java類裡,還是使用Mybatis框架呢? 相對來說,做一些複雜的大專案,用第三方開源的Mybatis會比較好。把資料庫操作語句抽取出來,寫在xml檔案,方便管理。 個人比較傾向於使用Mybatis,還有Mybat
JS 語法之--物件型別(構造器,class,this),高階物件(高階類,Minix模式)
1、JS 物件型別 JavaScript 是一種基於原型(prototype)的面嚮物件語言,而不是基於類的面嚮物件語言 C++, Java 有類Class 和例項Instance 的概念,類是一類事物 的抽象,而例項則是類的實體。 JS是基於原型的語言,它只有原型物件的概念,原型物件就是一
mybatis免sql外掛之JpaMapper-以Jpa hibernate的風格寫mybatis(生成自定義的MappedStatement)
mybatis免sql外掛之JpaMapper-以Jpa hibernate的風格寫mybatis(生成自定義的MappedStatement) 簡介 JpaMapper以Jpa hibernate的風格寫mybatis的程式碼,可以減少手動寫sql的煩惱。 優勢:
Mybatis之高階對映【一對一對映】
1.一對一對映 兩表關聯查詢。有兩種方案:對映檔案中輸出對映使用resultType或者resultMap。 需求:查詢人員資訊並關聯其部門。 資料庫兩張表: 人員表: 部門表: (
《TensorFlow:實戰Google深度學習框架》——5.4 模型持久化(模型儲存、模型載入)
目錄 1、持久化程式碼實現 2、載入儲存的TensorFlow模型 3、載入部分變數 4、載入變數時重新命名 1、持久化程式碼實現 TensorFlow提供了一個非常簡單的API來儲存和還原一個神經網路模型。這個API就是tf.train.Saver類。一下程式碼給出了儲
Scala:Function(高階函數語言程式設計)
一個可以進行高階函數語言程式設計的模組,我們來看看它都實現了哪些操作,並結合原始碼理解一下。 def chain[a](fs: Seq[(a) ⇒ a]): (a) ⇒ a 把一些列的方法串起來,挨個執行,每個方法的結果,回作為下一個方法的入參
Vant list 與better-scroll與下拉重新整理(其實是上拉載入)
發現件事情,我好想把下拉重新整理和下拉載入搞反了,所以其實這篇記錄的是上拉載入,emmm。。 先是用了vant的LIst下拉重新整理,然後發現better-scroll中這個外掛沒有用,然後自己寫了個監聽!最後發現一篇文章有封裝scroll中下拉重新整理!這個過