電商開發(fā)愛好者 - zzj項目的回顧

1)不同的事務策略

A

注解式事務策略

B

配置式事務策略

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

zzj的配置方法


pyg的配置方法

3)SqlSessionFactory以及mapper location的配置

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

pyg

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

mapper.xml與mapper.java不同位置
配置了別名

4)mapper.xml文件的不同

A

pyg是自動生成的

same_content

B

zzj自己手寫

same_content

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

controller里調用2個services

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

同一service能保證事務一致性


不同mapper

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

service里調用service,加入事務

service嵌套,加入事務


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

通用mapper將item_id指定為id

8)

事務處理方式的不同;

我們的事務都是放在service,不管是pyg, 還是zzj

maven導入3原則:全部導入,在使用的最底層導入,運行時在web導入

9)

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

指定響應類型:文本類型的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ù)。

clone() & append()

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

拼接json, 怎么看懂?

push一個對象:

保存為json對象

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

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

14)

直接JDBC是無法加緩存的;

人家會直接讓你注入service嗎?還是你直接call別人的接口比較好;如果是dubbo當然注入service,或者訪問dubbo所在的系統(tǒng)的API


i的類型不確定,所以泛型為?

15)

跨域的3個關鍵詞:

瀏覽器限制

必須是ajax請求

script的src有跨域請求資源的能力,但是 但是 它拿到的東西都會當作js解析

script標簽有跨域請求資源的能力

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

src只能解析js腳本

如果你使用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請求

直接訪問web service接口拿到數(shù)據(jù)

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

dubbo自動完成序列化

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寫一起是一樣的效果 );

zzj的做法

pyg的做法:controller和service分開寫

兩種不同的接口查詢:

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

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

看看人家success后的處理方式

*** 不僅是提供接口服務(通過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)

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容