1. 程式人生 > >mybatis (高階對映 快取 延遲載入)

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 同樣提供了一級快取二級快取的支援

  1. mybatis的一級快取是指SqlSession。一級快取的作用域是一個SqlSessionMybatis預設開啟一級快取

   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中下拉重新整理!這個過