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的区别
几点区别:
A
如果使用easyUI, 提交的数据比如page, rows都是easyUI传过来,注入Mapper虽然是接口,但自动扫描以及实例化到了内存就可以直接注入了,接着可以使用@RequestParam注解接收参数了
实际上他们是同样的流程,从前端传数据,controller接到数据,只不过zzj用的是同步的,直接call相应的url, pyg的angular用的是异步ajax
(get是查询(向一个url发起请求),post是提交,get可以附带参数,直接可以被接收;post就是表格提交)
PageHelper的使用:
B
为什么要用Restful?(就是想decent)
Web Service就是用来查询数据库的。提供间接的方式让别的项目有查询数据库的可能性...
C
业务状态码 和 响应状态码 ...
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服务是在展现层或者叫web层之类实现的;而jax-rs相对更适合纯粹的服务化应用,也就是传统Java EE中所说的中间层服务
而jax-rs相对更适合纯粹的服务化应用,也就是传统Java EE中所说的中间层服务
F
二进制序列化和文本序列化的区别(https://my.oschina.net/andot/blog/784235)
XML 和 JSON 是大家最常见的两种文本序列化格式。
Protocol Buffers,Msgpack,BSON,Hessian 等格式是二进制序列化格式的代表。
Hprose,PHP 序列化格式是半文本序列化的代表。
G
现在我们再来看看最流行的REST风格远程调用(文本序列化 + http协议)和dubbo RPC(二进制序列化 + tcp协议)之间怎么选?
首先要知道,凡是有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执行对应的sql语句的时候,只插入对应的name字段;(主键是自动添加的,默认插入为空)
这个字段是指你传入的字段,而不是表格里的字段;
保证刚插入时创建时间和更新时间是一个时间
a逻辑删除用update就行
b批量删除最后用in操作
点进来看看,这个是abel533提供的操作方法(通用mapper提供的方法,好像插入的id也可以得到...)
Mybatis 通用 Mapper 3.5.0 已发布。MyBatis 通用 Mapper 极其方便的使用 MyBatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询。通用 Mapper 可以极大的方便开发人员。
泛型注入:自动注入父接口的实现接口
eval:确定类型;
序列化以作为json数据传输...
angular的post提交是不是也有响应状态码?
jQuery有status:200, 400
7)商品提交和商品描述提交的区别
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数据
指定响应类型:文本类型的json数据
10)
父子容器,子容器要在自己当前的配置文件找值,如果值在父容器是不行的,所以可以借助propertyService...
隐私原则:子容器能注入父容器,比如controller中能注入service(容器是谁开启的,监听器listener)
父子容器:父容器的参数不能访问子容器
11)
itemDesc也是查询出来的:
遇到技术瓶颈要从业务角度去考虑;
12)
接到返回参数后的几种处理:
下面这是update之后的处理
还有删除后的处理:提示删除成功,然后reload; 添加也是一样的;
编辑:应该打开一个窗口;
查询:直接给出一个查询结果就行;
13)
类目的规格参数:一个类目一个规格... 电视一个模板,洗衣机一个模板;
mongo: 每一行的数据由我本身的数据来决定;来决定有几个字段;
这个表也非常简单,就是类目id跟数据
模拟点击了一下:用click()事件;
click() 方法触发 click 事件,或规定当发生 click 事件时运行的函数。
浏览器的内置对象:JSON.stringify,id通过val()获得,数据通过表单form获得:
拼接json, 怎么看懂?
push一个对象:
把这个对象放到隐藏表单里,然后通过js得到
这里也是js提交到我们后台RESTful,而且保存的时候也是根据响应状态码作为回应(是不是很像PHP?)
14)
直接JDBC是无法加缓存的;
人家会直接让你注入service吗?还是你直接call别人的接口比较好;如果是dubbo当然注入service,或者访问dubbo所在的系统的API
i的类型不确定,所以泛型为?
15)
跨域的3个关键词:
浏览器限制
必须是ajax请求
script的src有跨域请求资源的能力,但是 但是 它拿到的东西都会当作js解析
这里不是用jQuery jsonp来解决问题,而是靠script的src来解决问题的,这是因为后台返回的是json数据,这就是原始状态的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还有逻辑去执行
用户提交订单,请求先提交到我们前台系统的controller,再去访问订单系统的服务去提交订单;
这个是访问web service接口,都是通过发起get,post请求
通过dubbo不就是直接注入service吗? 通过dubbo协议调用dubbo发布的service实现类来达到自己的目的。后面一段不是通过get/post请求
17)
监听器启动Spring容器:
18)
提供接口哪些事
zzj这里即使用dubbo,它也只是用来代替httpclient,然后还是对外提供接口(dubbo不能对外提供接口,只能对外提供服务...),他说他师兄是汲取了JD的教训,只是对外提供API, 而不是让每个dubbo系统都去查询数据库(因为你用mapper那就是直接去查询数据库...)
zzj的做法:controller和service写在一起,interface和bean抽取出来供其它工程继承(其实把bean放到common,把interface和service写一起是一样的效果 );
pyg的做法:controller和service分开写
两种不同的接口查询:
.html, 也是组件式开发的一部分:
这才是组件式开发:
*** 不仅是提供接口服务(通过controller),而且把服务注册到了zookeeper中(通过dubbo)
dubbo用的就是spring的容器,而不是单独自己使用一个容器;
19)
httpclient的两种方式:
一种自己写的,还有一种是封装的;
20)
我们在做一些项目的思路:
以下大广告必然是我们自然而然的思路:但可以改变下,如果我们把广告数据都看作是内容呢?这适应于每个页面的广告;
21)
save也可以返回整个对象:
22)
接收参数的两种方式:
A通过对象接收;
B通过参数一个一个接收;
下面这个,你怎么接收呢?cues, notes, summary
一个一个接收更安全,但你还是要去创建一个新对象去更新:
23)
我们开发的web service,也就是对外提供的接口(从这个项目中学到很多知识,但我们要扩展到更多知识)
下面这2个controller的代码是一样的,但如果你单独拉一个api的包也没关系:
24)
为什么我们要使用httpclient?
想象下面这个场景:jsp页面需要一组数据 - controller要model这组数据到jsp页面(这个不像jsp直接去访问接口,而是先把数据组装到了jsp页面) - controller怎么拿到这组数据??(通过httpclient发起http请求,去访问其它工程提供的接口)
为什么百度要放弃糯米,因为维持这项业务的开销也非常大;
25)
bean的封装示范:
26)
单例模式和多例模式(多例就是每次调用就会创建一个新对象),且多例把管理交给了调用地方法;
单例获取多例,只能通过getBean()的方式获得:每次都到容器中去获取新创建的httpclient对象
27)
通信协议 - 通信的规则(TCP/IP互联网协议),邮寄包裹规则 寻址啥的...
5G - 高速公路 (有可能5G以后不会用TCP/IP协议)
IPV4前几年,ip就已经分配完了;IPV6是128位的IP地址,所以很有扩展空间;
28)
你看,这个数据的封装还是挺难的:
反序列化成一个对象 JsonNode,
取其中的数组 ArrayNode,
遍历数组得到想要的对象
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得到的数据应该是跟jQuery Ajax返回的数据一样,待验证
response应该是你在后台传过来的类对象, MyClass.result,在前端就是 response.result
C
组件式开发和获取数据以及返回数据
如果我们规范了获取数据和返回数据的方式,我们就能追求组件式开发;
增删改查有不同的返回数据,可以触发不同的组件去响应
比如自己的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是提交,跟带不带参数怎么带参数没多大关系,post也可以在url带参数;
d)webservice就是间接获取查数据库的能力,如果不能直接用其它项目的数据库,那只能用别人的web service
e)何谓轻量级?
f)什么时候改接收对象,什么时候改一个一个接收?
g)数据封装的技能?大技能...
h)监听器启动spring容器
i)Maven导入3原则
j)父子容器:父容器的参数不能访问子容器
k)返回结果与组件式开发的结合
l)根据返回结果得出反应跟PHP如出一辙
m)isEmpty和isBlank的区别
n)//getInstance()是单例方式,new Object()是多例,每部分调用都是一个新的对象
o)一个Page, 一个PageInfo
F
能用搜索引擎解决的问题,都不是问题;
用于保存向前,哪怕有阻碍,哪怕有解决不了的问题(可以先跳过去)
30)
我知道购物车我们也能倒腾出来,order的展示也是一样的;
order, orderItem里面的2个表都要展示出来:
以orderId为连接
我需要这样一个对象,以username为基准查询,然后根据orderId去查询orderItem
order的生成规则是:一个卖家一个orderId,方便投递...
以下这个将是模板:
entity.order和entity.orderItem,虽然一个customer有很多order
我们可以改成entity.order in entity.orderList order和order.orderItemList,只是包裹在外面的还是一层循环
可以单独创建一个方法查询orderItem, queryOrderItemByOrderId(orderId)
我们需要一个对象来接收这一切,这就是我们说的面向对象