摘要:場合常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用將每一條記錄映射到中,在前端頁面遍歷中是即可。作用將關聯查詢信息映射到一個對象中。
相關閱讀:
1、通過項目逐步深入了解Mybatis<一>
2、 通過項目逐步深入了解Mybatis<二>
本項目所有代碼及文檔都托管在 Github地址:https://github.com/zhisheng17/mybatis
Mybatis 高級知識安排:對訂單商品數據模型進行分析
訂單商品數據模型 數據模型分析思路:1、每張表記錄的數據內容(分模塊對每張表記錄的內容進行熟悉,相當于學習系統需求的過程)
2、每張表重要的的字段設置(非空字段、外鍵字段)
3、數據庫級別表與表之間的關系(外鍵關系)
4、表與表業務之間的關系(要建立在每個業務意義的基礎上去分析)
數據模型分析模型用戶表 user:記錄購買商品的用戶信息
訂單表 order:記錄用戶所創建的訂單(購買商品的訂單)
訂單明細表 orderdetail:(記錄了訂單的詳細信息即購買商品的信息)
商品表 items:記錄了商品信息
表與表業務之間的關系:
在分析表與表之間的業務關系時需要建立在某個業務意義基礎上去分析。
先分析數據級別之間有關系的表之間的業務關系:
1、usre和orders:
user ---> orders:一個用戶可以創建多個訂單,一對多
orders ---> user:一個訂單只由一個用戶創建,一對一
2、 orders和orderdetail:
orders ---> orderdetail:一個訂單可以包括 多個訂單明細,因為一個訂單可以購買多個商品,每個商品的購買信息在orderdetail記錄,一對多關系
orderdetail ---> orders:一個訂單明細只能包括在一個訂單中,一對一
3、 orderdetail 和 itesm:
orderdetail ---> itesms:一個訂單明細只對應一個商品信息,一對一
items ---> orderdetail:一個商品可以包括在多個訂單明細 ,一對多
再分析數據庫級別沒有關系的表之間是否有業務關系:
4、 orders 和 items:
orders 和 items 之間可以通過 orderdetail 表建立 關系。
一對一查詢 需求:查詢訂單信息,關聯查詢創建訂單的用戶信息
使用 resultTypesql 語句
確定查詢的主表:訂單表
確定查詢的關聯表:用戶表
關聯查詢使用內鏈接?還是外鏈接?
由于orders表中有一個外鍵(user_id),通過外鍵關聯查詢用戶表只能查詢出一條記錄,可以使用內鏈接。
SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id
創建 pojo
Orders.java
public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //用戶信息 private User user; //訂單明細 private Listorderdetails; //getter and setter }
OrderCustom.java
//通過此類映射訂單和用戶查詢的結果,讓此類繼承包括 字段較多的pojo類 public class OrdersCustom extends Orders{ //添加用戶屬性 /*USER.username, USER.sex, USER.address */ private String username; private String sex; private String address; //getter and setter }
映射文件
OrdersMapperCustom.xml
Mapper 文件
OrdersMapperCustom.java
public interface OrdersMapperCustom { public OrdersCustom findOrdersUser() throws Exception; }
測試代碼(記得在 SqlConfig.xml中添加載 OrdersMapperCustom.xml 文件)
@Test public void testFindOrdersUser() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //創建OrdersMapperCustom對象,mybatis自動生成代理對象 OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class); //調用OrdersMapperCustom的方法 Listlist = ordersMapperCustom.findOrdersUser(); System.out.println(list); sqlSession.close(); }
測試結果
?
?
使用 resultMapsql 語句(和上面的一致)
使用 resultMap 映射思路
使用 resultMap 將查詢結果中的訂單信息映射到 Orders 對象中,在 orders 類中添加 User 屬性,將關聯查詢出來的用戶信息映射到 orders 對象中的 user 屬性中。
//用戶信息 private User user;
映射文件
OrdersMapperCustom.xml
先定義 resultMap
Mapper 文件
public ListfindOrdersUserResultMap() throws Exception;
測試代碼
@Test public void testFindOrdersUserResultMap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //創建OrdersMapperCustom對象,mybatis自動生成代理對象 OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class); //調用OrdersMapperCustom的方法 Listlist = ordersMapperCustom.findOrdersUserResultMap(); System.out.println(list); sqlSession.close(); }
測試結果
使用 resultType 和 resultMap 一對一查詢小結resultType:使用resultType實現較為簡單,如果pojo中沒有包括查詢出來的列名,需要增加列名對應的屬性,即可完成映射。如果沒有查詢結果的特殊要求建議使用resultType。
resultMap:需要多帶帶定義resultMap,實現有點麻煩,如果對查詢結果有特殊的要求,使用resultMap可以完成將關聯查詢映射pojo的屬性中。resultMap可以實現延遲加載,resultType無法實現延遲加載。
一對多查詢需求:查詢訂單及訂單明細信息
SQL語句:
確定主查詢表:訂單表
確定關聯查詢表:訂單明細表
在一對一查詢基礎上添加訂單明細表關聯即可。
SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
分析:
使用 resultType 將上邊的查詢結果映射到 pojo 中,訂單信息的就是重復。
要求:
對 orders 映射不能出現重復記錄。
在 orders.java 類中添加 List
最終會將訂單信息映射到 orders 中,訂單所對應的訂單明細映射到 orders 中的 orderDetails 屬性中。
映射成的 orders 記錄數為兩條(orders信息不重復)
每個 orders 中的 orderDetails 屬性存儲了該訂單所對應的訂單明細。
映射文件:
首先定義 resultMap
Mapper 文件
public ListfindOrdersAndOrderDetailResultMap() throws Exception;
測試文件
@Test public void testFindOrdersAndOrderDetailResultMap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //創建OrdersMapperCustom對象,mybatis自動生成代理對象 OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class); //調用OrdersMapperCustom的方法 Listlist = ordersMapperCustom.findOrdersAndOrderDetailResultMap(); System.out.println(list); sqlSession.close(); }
測試結果
總結:mybatis使用resultMap的collection對關聯查詢的多條記錄映射到一個list集合屬性中。
使用resultType實現:將訂單明細映射到orders中的orderdetails中,需要自己處理,使用雙重循環遍歷,去掉重復記錄,將訂單明細放在orderdetails中。
多對多查詢需求:查詢用戶及用戶購買商品信息。
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 AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
映射思路:
將用戶信息映射到 user 中。
在 user 類中添加訂單列表屬性List
在Orders中添加訂單明細列表屬性List
在OrderDetail中添加Items屬性,將訂單明細所對應的商品映射到Items
映射文件
Mapper 文件
public List測試文件findUserAndItemsResultMap() throws Exception;
@Test public void testFindUserAndItemsResultMap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //創建OrdersMapperCustom對象,mybatis自動生成代理對象 OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class); //調用OrdersMapperCustom的方法 List測試:list = ordersMapperCustom.findUserAndItemsResultMap(); System.out.println(list); sqlSession.close(); }
我去,竟然報錯了,但是不要怕,通過查看報錯信息可以知道我忘記在 User.java 中加入 orderlist 屬性了,接下來我加上去,并加上 getter 和 setter 方法。
//用戶創建的訂單列表 private ListordersList; public List getOrdersList() { return ordersList; } public void setOrdersList(List ordersList) { this.ordersList = ordersList; }
再次測試就能成功了。
多對多查詢總結將查詢用戶購買的商品信息明細清單,(用戶名、用戶地址、購買商品名稱、購買商品時間、購買商品數量)
針對上邊的需求就使用resultType將查詢到的記錄映射到一個擴展的pojo中,很簡單實現明細清單的功能。
一對多是多對多的特例,如下需求:
查詢用戶購買的商品信息,用戶和商品的關系是多對多關系。
需求1:
查詢字段:用戶賬號、用戶名稱、用戶性別、商品名稱、商品價格(最常見)
企業開發中常見明細列表,用戶購買商品明細列表,
使用resultType將上邊查詢列映射到pojo輸出。
需求2:
查詢字段:用戶賬號、用戶名稱、購買商品數量、商品明細(鼠標移上顯示明細)
使用resultMap將用戶購買的商品明細列表映射到user對象中。
總結:
ResultMap 總結 resultType:使用resultMap是針對那些對查詢結果映射有特殊要求的功能,,比如特殊要求映射成list中包括多個list。
作用:
將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。
場合:
resultMap:常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。
association:使用association和collection完成一對一和一對多高級映射(對結果有特殊的映射要求)。
作用:
將關聯查詢信息映射到一個pojo對象中。
場合:
collection:為了方便查詢關聯信息可以使用association將關聯訂單信息映射為用戶對象的pojo屬性中,比如:查詢訂單及關聯用戶信息。
使用resultType無法將查詢結果映射到pojo對象的pojo屬性中,根據對結果集查詢遍歷的需要選擇使用resultType還是resultMap。
作用:
將關聯查詢信息映射到一個list集合中。
場合:
為了方便查詢遍歷關聯信息可以使用collection將關聯信息映射到list集合中,比如:查詢用戶權限范圍模塊及模塊下的菜單,可使用collection將模塊映射到模塊list中,將菜單列表映射到模塊對象的菜單list屬性中,這樣的作的目的也是方便對查詢結果集進行遍歷查詢。如果使用resultType無法將查詢結果映射到list集合中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66325.html
摘要:解決方法使用數據庫連接池管理數據庫連接。向中設置參數,對占位符號位置和設置參數值,硬編碼在代碼中,同樣也不利于系統的維護。從中遍歷結果集數據時,存在硬編碼,將獲取表的字段進行硬編碼,不利于系統維護。 Mybatis Mybatis 和 SpringMVC 通過訂單商品案例驅動 官方中文地址:http://www.mybatis.org/mybati... 官方托管地址:https://...
摘要:的實例不能共享使用,它也是線程不安全的。因此最佳的范圍是請求或方法范圍定義局部變量使用。在中就不需要直接對數據庫的連接參數進行硬編碼了。 轉載請務必注明出處,原創不易! 相關文章:通過項目逐步深入了解Mybatis 本項目全部代碼地址:Github-Mybatis Mybatis 解決 jdbc 編程的問題 1、 數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用...
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
閱讀 986·2021-09-26 10:15
閱讀 2064·2021-09-24 10:37
閱讀 2580·2019-08-30 13:46
閱讀 2631·2019-08-30 11:16
閱讀 2421·2019-08-29 10:56
閱讀 2591·2019-08-26 12:24
閱讀 3472·2019-08-23 18:26
閱讀 2661·2019-08-23 15:43