1、时间格式的大小写?
字母 日期或时间元素 表示 示例
G Era 标志符 Text AD
y 年 Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800
2、@RequestBody 和@ReponseBody使用的区别是什么?
1、ResponseBody
@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用;
通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
2、RequestBody
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
例子:
@RequestMapping("/login.do")
@ResponseBody
public Object login(@RequestBody User loginUuser, HttpSession session) {
user = userService.checkLogin(loginUser);
session.setAttribute("user", user);
return new JsonResult(user);
}
3、ArrayList与List的区别?列表与数组的关系?
List<Long> paths = new ArrayList<Long>(); //ArrayList是List的实现类。
4、null的流会返回null吗?
不会,如果没有元素,会返回一个空的list(待验证)
5、分页查询具流程是什么,用到了什么类,什么方法,仔细了解一下,分页插件是怎么起作用的,配置类是怎么起作用的?
1. 通过QueryWrapper动态查询到数据封装到I相应List集合中;
2.通过Mybatis-plus提供的Ipage类进一步封装;
3.利用自己写的PageUtils类封装返回给前端。
public PageUtils queryPage(Map<String, Object> params) {
IPage<AttrEntity> page = this.page(
new Query<AttrEntity>().getPage(params),
new QueryWrapper<AttrEntity>()
);
return new PageUtils(page);
}
6、@Param作用领域是啥,还有#{}与${}的区别?
补充:当查询的字段是整数时,输入的整数参数加上了单引号也是没有任何问题的;对于字段是不需要加单引号的,加上了也能够查出来,但是进行排序等操作时就没有相应效果了。
7、引入了mybati-plus依赖之后,要在对应的服务里面配置sql相关信息,不然会报错。不想要此依赖,可以用<exclusions>剔除掉。
8、@RestController是 @Controller 与@ResponseBod的结合。
9、后端校验中需要在实体类的属性上加上@NotNull(javax.validation.constraints包下,也就是导入依赖validation-api,之前一直没作用是导入了2.0的版本,换成了1.0的就可以了)等注解,并且在Controller类中的想要CRUD方法中加入@Valid注解,注意要引入spring-boot-starter-validation注解,因为Validation Starter no longer included in web starters。
10、@Validated 与 @Valid的区别,@Validated可以用于分组校验。@Validated是有spring框架提供的, @Valid是有javax包提供的。
@RequestMapping("/save")
//@RequiresPermissions("product:brand:save")
public R save(@Valid @RequestBody BrandEntity brand){
brandService.save(brand);
return R.ok();
}
自定义校验器(自定义注解):有点复杂
11、default关键字:一个借口中的方法在使用关键字default后可以有方法体了。
12、@RestControllerAdvice 是@ResponseBody和@ControllerAdvice的结合体, 用于统一处理异常。
13、@PathVariable 映射 URL 绑定的占位符通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx”) 绑定到操作方法的入参中。一般与@RequestMapping(method = RequestMethod.GET)一起使用
@RequestMapping("/getUserById/{name}")
public User getUser(@PathVariable("name") String name){
return userService.selectUser(name);
}
14、QueryWrapper<所要查询的实体类> wrapper = new QueryWrapper<所要查询的实体类>()用于sql查询查询。没有动态条件或者动态条件全都不满足是返回表中所有数据。
15、@JsonInclude(JsonInclude.Include.NON_EMPTY)(加在实体类的属性上)用于在后端判断返回给前端的json数据中的某一个属性是否为空。
16、VO(value object)值对象:
1、接收页面传递来的数据,封装对象
2、将业务处理完成的对象,封装成页面要用的数据
后端向前端传值的时候,每一次都是返回实体类对象(Json化),但是当传输的值不仅仅是实体类时,就需要VO。
17、规范:
controller类主要做:
1、接收前端信息并进行校验
2、调用想要service处理数据
3、对数据进行封装返回给前端
service主要做具体的业务逻辑,自己的service可以调用别的service,但不要调用别的dao;本类的service调用本类的dao。
18、琐碎的东西
//好好理解这个递归
private List<Long> findParentPath(Long catelogId,List<Long> paths){
paths.add(catelogId);
CategoryEntity byId = this.getById(catelogId);
if (byId.getParentCid() != 0){
findParentPath(byId.getParentCid(),paths);
}
return paths;
}
在数据库中,多对多一般就有一张中间表,比如品牌表与分类表是多对多的。如果分类表中的数据发生变化时,也不能只改分类表,相关联的表也要修改,尤其是一些表中存储了关于分类表的冗余字段。
避坑:
@Override
public void saveAttr(AttrVo attr) {
AttrEntity attrEntity = new AttrEntity();
BeanUtils.copyProperties(attr, attrEntity);
this.save(attrEntity);
AttrAttrgroupRelationEntity attrAttrgroupRelationEntity = new AttrAttrgroupRelationEntity();
Long a = attr.getAttrId(); //a确实为null
attrAttrgroupRelationEntity.setAttrId(attrEntity.getAttrId()); //为什么用attr.getAttrId()得不到数据
attrAttrgroupRelationEntity.setAttrGroupId(attr.getAttrGroupId());
attrAttrgroupRelationDao.insert(attrAttrgroupRelationEntity);
}
给CategoryServiceImpl.java和BrandServiceImpl.java中的方法加上@Transactional类之后修改不了对应的表了,不知道是什么问题。(P75最后几秒)
事务提交不了的情况
@Transactional
@Override
public void updateCascade(CategoryEntity category) {
this.updateById(category);
categoryBrandRelationService.updateCategory(category.getCatId(),category.getName());
}
//使用自定义sql语句方式,再加上事务就有问题,事务提交不了
@Override
public void updateCategory(Long catId, String name) {
this.baseMapper.updateCategory(catId,name); //方法2自定义sql语句
}
equalsIgnoreCase() 方法用于将字符串与指定的对象比较,不考虑大小写。
销售属性不和属性分组绑定,只有规格参数(基本属性)才和属性分组绑定,他们之间有一个关联的中间表。一个属性分组只对应一个分类。
81P,85P,87P的业务逻辑好好理解!
用Vo是规范,前后端交互用Vo,操作数据库用entity。
String.join()做字符串列表的拼接。
可以在服务的配置文件中设置时间的格式
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
Third-Party服务因为无法使用引入nacos的外部配置,所以直接OSS的相关信息也在了application.yml里面。