1)不同的事務策略
A

B

2) 更底層的properties文件的導入(對于pyg,dao都是被service繼承的,所以service會讀取applicationContext-dao.xml文件,而applicationContext-dao.xml又包含了db / mybatis / mapper文件)


3)SqlSessionFactory以及mapper location的配置
pyg沒有單獨配置mapper.xml的位置,而是直接mapper掃描(com.samemart.mapper實際上是一個位置)


zzj單獨給mapper.xml弄了一個地方


4)mapper.xml文件的不同
A
pyg是自動生成的

B
zzj自己手寫

5)Mybatis配置文件的不同
A pyg配置很簡單

B zzj配置了通用mapper

6)使用通用Mapper和不使用通用mapper的區(qū)別
幾點區(qū)別:
A
如果使用easyUI, 提交的數(shù)據(jù)比如page, rows都是easyUI傳過來,注入Mapper雖然是接口,但自動掃描以及實例化到了內存就可以直接注入了,接著可以使用@RequestParam注解接收參數(shù)了
實際上他們是同樣的流程,從前端傳數(shù)據(jù),controller接到數(shù)據(jù),只不過zzj用的是同步的,直接call相應的url, pyg的angular用的是異步ajax
(get是查詢(向一個url發(fā)起請求),post是提交,get可以附帶參數(shù),直接可以被接收;post就是表格提交)
PageHelper的使用:

B
為什么要用Restful?(就是想decent)
Web Service就是用來查詢數(shù)據(jù)庫的。提供間接的方式讓別的項目有查詢數(shù)據(jù)庫的可能性...

C
業(yè)務狀態(tài)碼 和 響應狀態(tài)碼 ...
D
何謂輕量級?
耦合比較少的,少繼承的就是輕量級;


E
dubbo與Restful
controller調用service就別用Restful Remoting了,多此一舉,性能還下降了(https://www.infoq.cn/article/2014/10/dubbox-open-source/?utm_source=infoq&utm_medium=popular_links_homepage#theCommentsSection);
支持 REST 風格遠程調用(HTTP + JSON/XML)也使得 Dubbo 可以對當今特別流行的“微服務”架構提供基礎性支持。
但比如minicart提供的接口還是可以是Restful的(這種情況下就是處理rest請求)
spring mvc既可以做好正常的web頁面請求也可以同時處理rest請求。但總的來說這個restful服務是在展現(xiàn)層或者叫web層之類實現(xiàn)的;而jax-rs相對更適合純粹的服務化應用,也就是傳統(tǒng)Java EE中所說的中間層服務
而jax-rs相對更適合純粹的服務化應用,也就是傳統(tǒng)Java EE中所說的中間層服務


F
二進制序列化和文本序列化的區(qū)別(https://my.oschina.net/andot/blog/784235)
XML 和 JSON 是大家最常見的兩種文本序列化格式。
Protocol Buffers,Msgpack,BSON,Hessian 等格式是二進制序列化格式的代表。
Hprose,PHP 序列化格式是半文本序列化的代表。
G
現(xiàn)在我們再來看看最流行的REST風格遠程調用(文本序列化 + http協(xié)議)和dubbo RPC(二進制序列化 + tcp協(xié)議)之間怎么選?
首先要知道,凡是有JSON文本序列化的地方都可以用Restful,所以pyg可以做成兩者的混合體;
其實Spring Cloud微服務是另外一種技術棧而已(就是http+json,內在的restful風格?);我會選擇dubbo
其實在zzj的項目中已經講得很清除了,如果不是web service不要勉強別人;項目與項目之間的調用可以是dubbo也可以是restful api
H
在pojo中添加JPA注解依賴:

對list的判斷:null=list || list.isEmtpy()
set方法沒用,只需要get方法,javaBean的技術特點:和方法名有關系,和屬性名沒關系:
因為方法名是我們的客戶端需要的東西;返回的值都要以客戶端為準;


insertSelective執(zhí)行對應的sql語句的時候,只插入對應的name字段;(主鍵是自動添加的,默認插入為空)
這個字段是指你傳入的字段,而不是表格里的字段;

保證剛插入時創(chuàng)建時間和更新時間是一個時間


a邏輯刪除用update就行
b批量刪除最后用in操作

點進來看看,這個是abel533提供的操作方法(通用mapper提供的方法,好像插入的id也可以得到...)
Mybatis 通用 Mapper 3.5.0 已發(fā)布。MyBatis 通用 Mapper 極其方便的使用 MyBatis 單表的增刪改查,支持單表操作,不支持通用的多表聯(lián)合查詢。通用 Mapper 可以極大的方便開發(fā)人員。


泛型注入:自動注入父接口的實現(xiàn)接口
eval:確定類型;
序列化以作為json數(shù)據(jù)傳輸...

angular的post提交是不是也有響應狀態(tài)碼?
jQuery有status:200, 400
7)商品提交和商品描述提交的區(qū)別
zzj的項目把商品和商品描述都同步到了表格form
a防止頁面html注入(就是在html里加一段代碼,比如id);
b這個item.getId()是肯定拿到了,因為前面的save了
POST請求也可以通過@RequestParam("desc")拿到
zzj是在controller里調用不同的service, 后來改成從service里調用service

pyg是調用同一service,不同的mapper


zzj還可以做到在ItemService中調用ItemDescService... 在這2個事務中能保證一致行嗎?能,后來的service會加入原來的事務

service嵌套,加入事務

這個就是$.messager.alert()插件

通用mapper將item_id指定為id

8)
事務處理方式的不同;
我們的事務都是放在service,不管是pyg, 還是zzj

maven導入3原則:全部導入,在使用的最底層導入,運行時在web導入
9)
指定響應類型:文本類型的json數(shù)據(jù)

指定響應類型:文本類型的json數(shù)據(jù)

10)
父子容器,子容器要在自己當前的配置文件找值,如果值在父容器是不行的,所以可以借助propertyService...
隱私原則:子容器能注入父容器,比如controller中能注入service(容器是誰開啟的,監(jiān)聽器listener)
父子容器:父容器的參數(shù)不能訪問子容器
11)
itemDesc也是查詢出來的:

遇到技術瓶頸要從業(yè)務角度去考慮;
12)
接到返回參數(shù)后的幾種處理:
下面這是update之后的處理

還有刪除后的處理:提示刪除成功,然后reload; 添加也是一樣的;
編輯:應該打開一個窗口;
查詢:直接給出一個查詢結果就行;
13)
類目的規(guī)格參數(shù):一個類目一個規(guī)格... 電視一個模板,洗衣機一個模板;
mongo: 每一行的數(shù)據(jù)由我本身的數(shù)據(jù)來決定;來決定有幾個字段;
這個表也非常簡單,就是類目id跟數(shù)據(jù)

模擬點擊了一下:用click()事件;

click() 方法觸發(fā) click 事件,或規(guī)定當發(fā)生 click 事件時運行的函數(shù)。

瀏覽器的內置對象:JSON.stringify,id通過val()獲得,數(shù)據(jù)通過表單form獲得:

拼接json, 怎么看懂?
push一個對象:

把這個對象放到隱藏表單里,然后通過js得到

這里也是js提交到我們后臺RESTful,而且保存的時候也是根據(jù)響應狀態(tài)碼作為回應(是不是很像PHP?)

14)
直接JDBC是無法加緩存的;
人家會直接讓你注入service嗎?還是你直接call別人的接口比較好;如果是dubbo當然注入service,或者訪問dubbo所在的系統(tǒng)的API
i的類型不確定,所以泛型為?

15)
跨域的3個關鍵詞:
瀏覽器限制
必須是ajax請求
script的src有跨域請求資源的能力,但是 但是 它拿到的東西都會當作js解析

這里不是用jQuery jsonp來解決問題,而是靠script的src來解決問題的,這是因為后臺返回的是json數(shù)據(jù),這就是原始狀態(tài)的jsonp

如果你使用isEmpty則空串不是空

16)
消息轉換器:override 原來的消息轉換器,并加上支持jsonp


前端還是采用JSONP的方式調用 #并不是直接訪問
URL_Serv: "http://console.samemart.com:10081/rest/api/item/cat?callback=category.getDataService",
$.getJSONP(this.URL_Serv, category.getDataService)? #category.getDataService還有邏輯去執(zhí)行
用戶提交訂單,請求先提交到我們前臺系統(tǒng)的controller,再去訪問訂單系統(tǒng)的服務去提交訂單;
這個是訪問web service接口,都是通過發(fā)起get,post請求

通過dubbo不就是直接注入service嗎? 通過dubbo協(xié)議調用dubbo發(fā)布的service實現(xiàn)類來達到自己的目的。后面一段不是通過get/post請求

17)
監(jiān)聽器啟動Spring容器:

18)
提供接口哪些事
zzj這里即使用dubbo,它也只是用來代替httpclient,然后還是對外提供接口(dubbo不能對外提供接口,只能對外提供服務...),他說他師兄是汲取了JD的教訓,只是對外提供API, 而不是讓每個dubbo系統(tǒng)都去查詢數(shù)據(jù)庫(因為你用mapper那就是直接去查詢數(shù)據(jù)庫...)
zzj的做法:controller和service寫在一起,interface和bean抽取出來供其它工程繼承(其實把bean放到common,把interface和service寫一起是一樣的效果 );

pyg的做法:controller和service分開寫

兩種不同的接口查詢:


.html, 也是組件式開發(fā)的一部分:

這才是組件式開發(fā):


*** 不僅是提供接口服務(通過controller),而且把服務注冊到了zookeeper中(通過dubbo)
dubbo用的就是spring的容器,而不是單獨自己使用一個容器;
19)
httpclient的兩種方式:
一種自己寫的,還有一種是封裝的;
20)
我們在做一些項目的思路:
以下大廣告必然是我們自然而然的思路:但可以改變下,如果我們把廣告數(shù)據(jù)都看作是內容呢?這適應于每個頁面的廣告;

21)
save也可以返回整個對象:

22)
接收參數(shù)的兩種方式:
A通過對象接收;
B通過參數(shù)一個一個接收;
下面這個,你怎么接收呢?cues, notes, summary

一個一個接收更安全,但你還是要去創(chuàng)建一個新對象去更新:

23)
我們開發(fā)的web service,也就是對外提供的接口(從這個項目中學到很多知識,但我們要擴展到更多知識)

下面這2個controller的代碼是一樣的,但如果你單獨拉一個api的包也沒關系:

24)
為什么我們要使用httpclient?
想象下面這個場景:jsp頁面需要一組數(shù)據(jù) - controller要model這組數(shù)據(jù)到jsp頁面(這個不像jsp直接去訪問接口,而是先把數(shù)據(jù)組裝到了jsp頁面) - controller怎么拿到這組數(shù)據(jù)??(通過httpclient發(fā)起http請求,去訪問其它工程提供的接口)
為什么百度要放棄糯米,因為維持這項業(yè)務的開銷也非常大;
25)
bean的封裝示范:


26)
單例模式和多例模式(多例就是每次調用就會創(chuàng)建一個新對象),且多例把管理交給了調用地方法;
單例獲取多例,只能通過getBean()的方式獲得:每次都到容器中去獲取新創(chuàng)建的httpclient對象

27)
通信協(xié)議 - 通信的規(guī)則(TCP/IP互聯(lián)網(wǎng)協(xié)議),郵寄包裹規(guī)則 尋址啥的...
5G - 高速公路 (有可能5G以后不會用TCP/IP協(xié)議)
IPV4前幾年,ip就已經分配完了;IPV6是128位的IP地址,所以很有擴展空間;
28)
你看,這個數(shù)據(jù)的封裝還是挺難的:
反序列化成一個對象 JsonNode,
取其中的數(shù)組 ArrayNode,
遍歷數(shù)組得到想要的對象

asText();
?

用內容替代smc中的內容...

29)
到目前為止,我們做個總結:2019-07-17
A
我們去訪問別人的接口有4種方式:
a通過ajax call, 訪問的是其它項目的controller,同b可以緩存username到redis
b通過httpclient去訪問, 訪問的是其它項目的controller,可以加緩存比如username, 可以緩存到redis
c通過dubbo訪問別人注冊到zookeeper的服務(依賴interface然后像注入本地的服務一樣),訪問的是其它項目的service,實際上還是走的mapper/db
d直接開放db的訪問權限,讓丫自己去玩(這里有過經驗教訓...)
B
angularJS能直接用RESTful api來訪問嗎?
angularJS的controller得到的數(shù)據(jù)應該是跟jQuery Ajax返回的數(shù)據(jù)一樣,待驗證
response應該是你在后臺傳過來的類對象, MyClass.result,在前端就是?response.result
C
組件式開發(fā)和獲取數(shù)據(jù)以及返回數(shù)據(jù)
如果我們規(guī)范了獲取數(shù)據(jù)和返回數(shù)據(jù)的方式,我們就能追求組件式開發(fā);
增刪改查有不同的返回數(shù)據(jù),可以觸發(fā)不同的組件去響應
比如自己的alert()或一些框架的alert()
D
log的接入,只需引入slf, 然后引入如下的方式,至于秒殺的那種(另外一種方式可以借鑒)
private static final Logger LOGGER = LoggerFactory.getLogger(CartMergeHandler.class);
if(LOGGER.isInfoEnabled()) { LOGGER.info("Received message:{}", msg); }
E
幾個關鍵知識:
a)注入Mapper雖然是接口,但自動掃描以及實例化到了內存就可以直接注入了;
b)httpclient必須是多例,但怎么用單例對接多例?通過配置bean的方式;
c)安裝字面意思理解,get就是查詢,post是提交,跟帶不帶參數(shù)怎么帶參數(shù)沒多大關系,post也可以在url帶參數(shù);
d)webservice就是間接獲取查數(shù)據(jù)庫的能力,如果不能直接用其它項目的數(shù)據(jù)庫,那只能用別人的web service
e)何謂輕量級?
f)什么時候改接收對象,什么時候改一個一個接收?
g)數(shù)據(jù)封裝的技能?大技能...
h)監(jiān)聽器啟動spring容器
i)Maven導入3原則
j)父子容器:父容器的參數(shù)不能訪問子容器
k)返回結果與組件式開發(fā)的結合
l)根據(jù)返回結果得出反應跟PHP如出一轍
m)isEmpty和isBlank的區(qū)別
n)//getInstance()是單例方式,new Object()是多例,每部分調用都是一個新的對象
o)一個Page, 一個PageInfo
F
能用搜索引擎解決的問題,都不是問題;
用于保存向前,哪怕有阻礙,哪怕有解決不了的問題(可以先跳過去)
30)
我知道購物車我們也能倒騰出來,order的展示也是一樣的;
order, orderItem里面的2個表都要展示出來:
以orderId為連接
我需要這樣一個對象,以username為基準查詢,然后根據(jù)orderId去查詢orderItem
order的生成規(guī)則是:一個賣家一個orderId,方便投遞...

以下這個將是模板:
entity.order和entity.orderItem,雖然一個customer有很多order
我們可以改成entity.order in entity.orderList????????????????????? order和order.orderItemList,只是包裹在外面的還是一層循環(huán)
可以單獨創(chuàng)建一個方法查詢orderItem, queryOrderItemByOrderId(orderId)

我們需要一個對象來接收這一切,這就是我們說的面向對象