2019.11️

十一月,很快,已经实习一个多月了,感觉最近写的业务还是挺多的,也学习到了许多东西,平时自己遇到了困难也会在这里总结下,不过这个月偷懒了一把,没利用空余的时间去学习新的技术,不过最近开始看书了😂。

1. Spring中@RequestParam和@RequestBody区别

注解@RequestParam接收的参数是来自requestHeader中,即请求头。通常用于GET请求,像POST、DELETE等其它类型的请求也可以使用。@RequestParam用来处理 Content-Type 为 application/x-www-form-urlencoded 编码的内容,Content-Type默认为该属性。

@RequestParam有三个配置参数:

  • required 表示是否必须,默认为 true,必须。
  • defaultValue 可设置请求参数的默认值。
  • value 为接收url的参数名(相当于key值)。

注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据。通常用于接收POST、DELETE等类型的请求数据,GET类型也可以适用。

2.Array.asList()

发现在开发中还是比较常见到Arrays.asList()的,我们可以使用它将一个数组转换为一个List集合。

  • Arrays.asList()将数组转换为集合后,底层其实还是数组。

  • 使用时要注意:传递的数组必须是对象数组,而不是基本类型。Arrays.asList()是泛型方法,传入的对象必须是对象数组。

  • 使用集合的修改方法:add()、remove()、clear()会抛出异常。Arrays.asList() 方法返回的并不是 java.util.ArrayList ,而是 java.util.Arrays 的一个内部类,这个内部类并没有实现集合的修改方法或者说并没有重写这些方法。

  • 正确的将数组转换为ArrayList的方法:

  1. 直接转
List list = new ArrayList<>(Arrays.asList(arr));
  1. 使用 Java8 的Stream:
List myList = Arrays.stream(arr).collect(Collectors.toList());
3. 数据库表设计
  • 字段如果是字符的话,字符编码必须使用utf8-mb4,要统一,不然会报错。
  • 尽量不要以MySQL关键字作为字段的命名,可参考官方文档,不然做查询语句的时候会出错。
  • 每个数据表必须存在主键,除特殊情况外,应使用自增主键。
  • 除特殊情况外,所有字段必须设定默认值并且一定不可以出现NULL类型。
4.resultType和resultMap区别

官方文档

  • resultType 从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。
  • resultMap 外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂映射的情形都能迎刃而解。可以使用 resultMap 或 resultType,但不能同时使用。
5.Spring中的事务机制

1、 Spring中事务的传播行为:

事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

2、Spring事务种类
Spring中的事务一般分为编程式事务和声明式事务,由于编程式事务比较复杂,一般我们在项目中都是使用声明式事务,也比较方便,而声明式事务也有很多种类型来定义。
全面分析 Spring 的编程式事务管理及声明式事务管理

  • 一种是在配置文件(xml)中做相关的事务规则声明

  • 还有就是基于 @Transactional 的声明式事务管理
    虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 小组建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
    还有就是Spring 的 AOP 的自调用问题会导致 就算出现异常也不会回滚,需要注意!
    自调用问题就是说:同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。
    自调用问题
    透彻的掌握 Spring 中@transactional 的使用

6.Charles工具的使用

工欲善其事,必先利其器,好的工具让你开发效率倍增。这款工具比起wireshark好用多了,也可以用来看手机APP的接口(要手机跟电脑连接同一网段)。

  • 截取 Http 和 Https 网络封包。
  • 支持重发网络请求,方便后端调试。
  • 支持修改网络请求参数。
  • 支持网络请求的截获并动态修改。
  • 支持模拟慢速网络。

其中使用Map也可以将远程地址的接口转发到本地,比如可以将测试环境或者生产环境的地址转发到本地的地址,这个时候本地也要有一份跟测试环境一样的数据库,然后当你在线上操作测试环境时,实际上操作的就是你本地的数据库。功能强大。还有一些Rewirte 和 Breakpoints 功能等,具体可以参考Charles 从入门到精通
在这里插入图片描述

7.Java8新特性

Java8的新特性,真的给开发者带来了福音,在开发中也很实用,尤其是流Stream,Optional判断空指针异常等,LocalDateTime代替Date,总的来说新特性有以下几个:
这里只做总结:不做具体功能,详情可以参考相关博客,JavaGuide博主总结的太好了哈哈哈详解Java8

  • Lambda表达式
  • 接口的默认方法(使用 default 关键字向接口添加非抽象方法实现)
  • 方法引用(::)
  • 流Stream(filter、sort、map、collect、reduce、count)IBM流详解
  • Optional(可预防空指针)
  • LocalDateTime(以后尽量用这个代替Date)
8.JavaBean中用LocalDateTime 修饰 创建时间 报错

谷歌了一下,是Mybatis-plus版本跟druid连接池版本冲突的问题,我曾创建一个新项目,其中用Mybatis-plus➕hikari 连接池,这样使用LocalDateTime修饰created_at就不会报错。

之前项目中用到的Mybatis-plus ➕ druid 就会出现报错。参考

解决方法:

  • 1、使用Date类型修饰Bean
  • 2、换连接池,使用hikariCP
12月 TODO
  1. 加强SQL语句的编写。
  2. 对Redis的熟练应用。
  3. 看一本书。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值