十一月,很快,已经实习一个多月了,感觉最近写的业务还是挺多的,也学习到了许多东西,平时自己遇到了困难也会在这里总结下,不过这个月偷懒了一把,没利用空余的时间去学习新的技术,不过最近开始看书了😂。
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的方法:
- 直接转
List list = new ArrayList<>(Arrays.asList(arr));
- 使用 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)
- 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
- 加强SQL语句的编写。
- 对Redis的熟练应用。
- 看一本书。