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