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:一個訂單明細只能包括在一個訂單中,一對一
- orders --> orderdetail:一個訂單可以包括多個訂單明細,因為一個訂單可以購買多個商品,每個商品的購買資訊在orderdetail記錄,一對多
- 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