1. 程式人生 > >day62_Mybatis學習筆記_02

day62_Mybatis學習筆記_02

  • 今天內容安排:
    • 1、高階結果對映(一對一、一對多、多對多)(重點)
    • 2、延遲載入
    • 3、查詢快取
    • 4、Spring 和 mybatis 的整合(重點)
    • 5、逆向工程

1、高階結果對映(即:關聯查詢對映)(重點)

1.1、分析資料模型

1.1.1、思路

  • 1、每張表記錄的資料內容(即:明確每張表儲存的資訊)
    • `分模組`對每張表記錄的內容進行熟悉,相當於你`學習系統需求(功能)`的過程。
  • 2、每張表重要的欄位(即:明確每張表中關鍵欄位(主鍵、外來鍵、非空))
    • `主鍵`、`外來鍵`、非空欄位
  • 3、資料庫級別表與表的關係(即:明確資料庫中表與表之間的外來鍵關係)
    • 外來鍵關係
  • 4、表與表之間的業務關係(即:明確業務中表與表的關係(建立在具體的業務上))
    • 在分析表與表之間的業務關係時一定要建立`在某個業務意義基礎上去分析`。

1.1.2、圖解分析

1.1.3、資料庫表之間有外來鍵關係的業務關係

  • user和orders:
    • user --> orders:一個使用者可以建立多個訂單,一對多
    • orders --> user:一個訂單隻由一個使用者建立,一對一
  • orders和orderdetail:
    • orders --> orderdetail:一個訂單可以包括多個訂單明細,因為一個訂單可以購買多個商品,每個商品的購買資訊在orderdetail記錄,一對多
    • orderdetail --> orders:一個訂單明細只能包括在一個訂單中,一對一
  • orderdetail和ites:
    • orderdetail --> itesms:一個訂單明細只對應一個商品資訊,一對一
    • items --> orderdetail:一個商品可以包括在多個訂單明細中 ,一對多

1.1.4、資料庫表之間沒有外來鍵關係的業務關係

  • orders和items:
    • 這兩張表沒有直接的外來鍵關係,通過業務及資料庫的間接關係分析出它們是多對多的關係。
    • orders -–> orderdetail -–> items:一個訂單可以有多個訂單明細,一個訂單明細對應一個商品,所以一個訂單對應多個商品
    • items -–> orderdetail -–> orders:一個商品可以對應多個訂單明細,一個訂單明細對應一個訂單,所以一個商品對應多個訂單
  • user和items:
    • 這兩張表沒有直接的外來鍵關係,通過業務及資料庫的間接關係分析出它們是多對多的關係。
    • user -–> orders -–> orderdetail -–> items:一個使用者有多個訂單,一個訂單有多個訂單明細、一個訂單明細對應一個商品,所以一個使用者對應多個商品
    • items -–> orderdetail -–> orders -–> user:一個商品對應多個訂單明細,一個訂單明細對應一個訂單,一個訂單對應一個使用者,所以一個商品對應多個使用者

1.2、一對一查詢

1.2.1、需求

  • 查詢訂單資訊,關聯查詢建立訂單的使用者資訊(使用者名稱稱和性別)

1.2.2、SQL語句

  • 確定查詢的主表:訂單表 orders
  • 確定查詢的關聯表:使用者表 user
  • 關聯查詢使用內連線呢?還是外連線呢?到了企業裡面,我們寫sql時大多數的時候我們需要考慮,很多時候,我們會使用外連線,要先把主表資訊查詢出來,然後需要考慮是使用左外連線還是右外連線,記錄為空的要不要,不考慮好的話,查詢到的結果集數量會和我們預想的有很大出入。
  • 本例中我們使用的是等值連線,所以暫時我們不用考慮那麼多。

sql語句如下:

SELECT  orders.id,  orders.user_id,  orders.number,  user.username,  user.sexFROM  orders,  userWHERE orders.user_id = user.id;

1.2.3、resultType

  • 複雜查詢時,單表對應的po類已不能滿足輸出結果集的對映。
  • 所以要根據需求建立一個擴充套件類來作為resultType的型別。

(1)建立擴充套件PO類  一般User.java類要和資料表表欄位一致,最好不要在這裡面新增其他欄位,今天學習mybatis的逆向工程時,會根據表結構,生成po類,如果在po類中擴充套件欄位,此時會被覆蓋掉。  所以針對要擴充套件的po類,我們需要建立一個擴充套件類,來繼承它。

/** * 通過此類對映訂單和使用者查詢的結果,讓此類繼承包括欄位較多的pojo類 * @author Bruce * */public class OrdersExt extends Orders {    // 新增使用者屬性    // user.username    // user.sex    private String username;    private String sex;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }}

(2)編寫mapper介面  建立OrdersMapper介面類,在類中新增以下內容:

public interface OrdersMapper {    // 一對一對映之 resultType    // 查詢訂單資訊,關聯查詢建立訂單的使用者資訊(使用者名稱稱和性別)    public List<OrdersExt> findOrdersAndUser();}

(3)編寫對映檔案  建立OrdersMapper.xml對映檔案,在對映檔案中新增以下內容:

<mapper namespace="com.itheima.mybatis.mapper.OrdersMapper">    <!-- 一對一對映之 resultType -->    <!-- 查詢訂單資訊,關聯查詢建立訂單的使用者資訊(使用者名稱稱和性別) -->    <select id="findOrdersAndUser" resultType="com.itheima.mybatis.po.OrdersExt">        SELECT          orders.id,          orders.user_id,          orders.number,          user.username,          user.sex        FROM          orders,          user        WHERE orders.user_id = user.id    </select></mapper>

(4)載入對映檔案  在config/SqlMapConfig.xml中,新增以下內容:

    <!-- 載入mapper,即載入對映檔案 -->    <mappers>        <!-- 使用相對於類路徑的資源,載入配置檔案 -->        <!--          <mapper resource="sqlmap/User.xml"/>        <mapper resource="mapper/UserMapper.xml"/>        <mapper resource="mapper/OrdersMapper.xml"/>        -->        <!-- 推薦使用:批量載入mapper檔案,需要mapper介面檔案和mapper對映檔名稱相同且在同一個包下 -->        <package name="com.itheima.mybatis.mapper"/>    </mappers>

(5)編寫測試程式碼

    @Test    public void testFindUserById() {        // 根據SqlSessionFactory建立SqlSession        SqlSession sqlSession = sqlSessionFactory.openSession();        // 建立OrdersMapper物件        // 由Mybatis通過sqlSession來建立動態代理物件        OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);        List<OrdersExt> list = mapper.findOrdersAndUser();        System.out.println(list);        sqlSession.close();    }

(6)小結

  • 使用resultType來進行一對一結果對映,查詢出的列的個數和對映的屬性的個數要一致。而且對映的屬性要存在與一個大的物件中,它是一種平鋪式的對映,即:資料庫查詢出多少條記錄,則對映成多少個物件。

1.2.4、resultMap

  • 使用resultMap來進行一對一結果對映,它是將關聯物件新增到主資訊的物件中,具體說是物件巢狀物件的一種對映方式。

(1)修改擴充套件PO類  在OrdersExt類中,新增User物件

/** * 通過此類對映訂單和使用者查詢的結果,讓此類繼承包括欄位較多的pojo類 * 在OrdersExt類中,新增User物件 * @author Bruce * */public class OrdersExt extends Orders {    // 新增使用者屬性    // user.username    // user.sex    private String username;    private String sex;    // 新增使用者物件(使用者資訊)    private User user;    public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }}

(2)編寫mapper介面

    // 一對一對映之 resultMap    // 查詢訂單資訊,關聯查詢建立訂單的使用者資訊(使用者名稱稱和性別)    public List<OrdersExt> findOrdersAndUserResultMap();

(3)編寫對映檔案

    <!-- 宣告/定義一個resultMap -->    <resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndUserResultMap">        <!-- 訂單資訊對映 -->        <id column="id" property="id"/>        <result column="user_id" property="userId"/>        <result column="number" property="number"/>        <!-- 使用者資訊對映(一對一) -->        <!--             association標籤:定義一個一對一關係                property:指定關聯物件要對映到OrdersExt的哪個屬性上                 javaType:指定關聯物件所要對映的java型別                id標籤:指定關聯物件結果集的唯一標識,很重要,建議在關聯查詢時必須寫上,不寫不會報錯,但是會影響效能        -->        <association property="user" 
            
           

相關推薦

day62_Mybatis學習筆記_02

今天內容安排: 1、高階結果對映(一對一、一對多、多對多)(重點) 2、延遲載入 3、查詢快取 4、Spring 和 mybatis 的整合(重點) 5、逆向工程 1、高階結果對映(即:關聯查詢對映)(重點) 1.1、分析資料模型 1.1.1、思路 1、每張表記錄

Hibernate學習筆記_02

提交 dao層 .get cti log www 並且 open cglib 上篇文章(傳送門:Hibernate學習筆記_01)介紹了Hibernate是什麽,如何搭建,配置文件詳解以及Hibernate的一些基本API詳解這幾個方面做了簡單介紹,那麽本文將會從一下5

Flask_學習筆記_02: URL和檢視

今天來學習Flask中URL和檢視的相關知識。 URL不多說了,訪問網站,瀏覽器中的地址大家都可以看到,比如我的51CTO的blog網址是:http://blog.51cto.com/jiaszwx 如果你在位址列裡敲:http://blog.51cto.com/ 那麼瀏覽器返回的是51CTO部落格的主頁

Flask_學習筆記_02: URL和視圖

通過 輸入 從數據 -o easy 技術分享 welcome 參數 直接 今天來學習Flask中URL和視圖的相關知識。 URL不多說了,訪問網站,瀏覽器中的地址大家都可以看到,比如我的51CTO的blog網址是:http://blog.51cto.com/jiaszwx

Flask_學習筆記_02: 頁面跳轉

頁面跳轉是網頁開發中需要實現的最基本的一個功能,使用者點選頁面中的一個超連結或者按鈕,就會跳轉到一個新頁面。那麼在Flask當中是如何實現的呢? 在下面的例子中,也會用到url_for(),還有另外一個redirect。目前幾乎所有的網站都需要使用者登入,才能釋出新內容或者做相關的更改。下面就以使用者要釋出

SpringMVC學習筆記_02

1、springmvc對多檢視的支援 (1)匯入xml格式檢視支援的jar包   注意:springmvc本身就支援xml格式,所以不用匯入其他支援的jar包了。 (2)在springmvc.xml中配置支援多檢視     <!-- 配置支援

day43_Oracle學習筆記_02

八、子查詢 示例程式碼如下:子查詢.txt SQL> --rownum 行號SQL> select rownum,empno,ename,sal from emp;    ROWNUM      EMPNO ENAME             SAL                    

day46_Webservice學習筆記_02

一、回顧昨天所學 什麼是webservice?    什麼是遠端呼叫技術?答:系統和系統之間的呼叫,從遠端系統當中獲取業務資料。    Webservice是web服務,他是用http傳輸SOAP協議資料的一種遠端呼叫技術。Webservice的入門程式    服務端        第一步:建立SEI介

day64_SpringMVC學習筆記_02

1、springmvc對多檢視的支援 (1)匯入xml格式檢視支援的jar包   注意:springmvc本身就支援xml格式,所以不用匯入其他支援的jar包了。 (2)在springmvc.xml中配置支援多檢視     <!-- 配置支援多檢視 -->    <bean 

OpenGL_Qt學習筆記_02(繪製簡單平面幾何圖形)

#include "glwidget.h" #include "ui_glwidget.h" #include <QtGui> #include <QtCore> #include <QtOpenGL> #ifndef GL_MULTISAMPLE #define

Robot Operating System (ROS)學習筆記4---語音控制

sla 語音 出現 tput http 學習 process 輸入 ubun 搭建環境:XMWare Ubuntu14.04 ROS(indigo) 轉載自古月居 轉載連接:http://www.guyuehome.com/260 一、語音識別包 1、安裝

MySQL學習筆記(六)—— MySQL自連接

概念 cor 子查詢 ron 表操作 例子 質量 _id order by 有的時候我們需要對同一表中的數據進行多次檢索,這個時候我們可以使用之前學習過的子查詢,先查詢出需要的數據,再進行一次檢索。 例如:一張products表,有產品id,供應商id(vend_

jquery 深入學習筆記之中的一個 (事件綁定)

color 動態 name his pan mouseover this pre con 【jquery 事件綁定】 1、加入元素事件綁定 (1) 加入事件為當前元素 $(‘p‘).on(‘click‘,function(){ //code here ..

AngularJS入門學習筆記

rect directive 技術分享 attr 兩個 ava 內容 module 大括號 首先聲明: 本博客源自於學習:跟我學AngularJs:AngularJs入門及第一個實例。通過學習,我自己的一些學習筆記。 1.AngularJS的一些基本特性 (1)使用雙大括號

Python學習筆記-2017.5.4

列表 lin 覆蓋範圍 復習 處理 pytho 內部 global txt 本文章記錄學習過程中的細節和心得: 復習所學課程: 1、文件的操作:   打開文件,對文件的操作打開方式有兩種:   第一種:      f = open("test.txt", "r")#以只讀

SAS學習筆記之函數應用

不能 oracle 理解 資料 oracl 函數應用 特殊 put acl 今天在做數據需求的時候遇到一些問題,因為不能夠在數據庫裏面做,僅僅好在SAS裏面實現。這就遇到了一些麻煩,須要使用一些函數實現部分功能,如查找字段中某個特殊字符出現的次數,查找某個字符的位置等,

OpenCV2學習筆記(十五):利用Cmake高速查找OpenCV函數源代碼

one 生成 img log 分享 lan 學習筆記 全部 modules 在使用OpenCV時,在對一個函數的調用不是非常了解的情況下,通常希望查到該函數的官方聲明。而假設想進一步研究OpenCV的函數,則必須深入到源碼。在VS中我們能夠選中想要查

avalonjs 學習筆記1---checkbox

nod item ack lex server ini npm 學習 define 一、vscode 安裝使用 1.vs code+node.js下載安裝 2.在node.js command prompt 中運行 npm install -g live-server 3

Linux學習筆記(三):系統執行級與執行級的切換

查看 用戶操作 回車 water hat ntsysv tde 文件表 config 1.Linux系統與其它的操作系統不同,它設有執行級別。該執行級指定操作系統所處的狀態。Linux系統在不論什麽時候都執行於某個執行級上,且在不同的執行級上執行的程序和服務都不同,所要

Principle of Computing (Python)學習筆記(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

ide out generate depth sku color ati cond with 1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/prin