1,mysql用8.0版本时,数据库配置文件database.properties的url里面要加上时区
如:servertimezone:Asia/shanghai
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
2,XML 中的 SQL 使用了 $ ,那么参数中也需要 @Param 注解
MyBatis 中 @Param 注解的四种使用场景,最后一种经常被人忽略! - 江南一点雨 - 博客园
$ 会有注入漏洞的问题,但是有的时候你不得不使用 $ 符号,例如要传入列名或者表名的时候,这个时候必须要添加 @Param 注解,例如:
@Mapper
public interface UserMapper {
List<User> getAllUsers(@Param("order_by")String order_by);
}
对应的 XML 定义如下:
<select id="getAllUsers" resultType="org.javaboy.helloboot.bean.User">
select * from user
<if test="order_by!=null and order_by!=''">
order by ${order_by} desc
</if>
</select>
3,泛型
尖括号<>里面的内容,是对这个集合的类型做了规定。所以这种约束条件,最大的好处就是增加了安全性,就好比不同口径的瓶子,只能装合适的物品,String类型的瓶子只能装String类型的对象。
程序 = 数据结构 + 算法
如果执行一个写死的程序(比如输出HelloWorld),那么无论怎样运行,结果都是一样的。这样的程序是没有意义的。
(1)那么,如果想让某个方法发挥作用,就要让它是可以“变化”的,如果把输出的数据单独拿出来,作为函数的参数,而方法不变,那么就可以根据不同的参数,用同样的方法输出不同的结果。
这就是函数。
(2)反之,如果待处理的数据不变,而处理数据的方法改变,把方法作为参数,就有了回调函数。
以上两种变化都是对于函数的,而泛型是对于类来说的。
我们看一看ArrayList的源码(部分):
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
public E get(int index) {
Objects.checkIndex(index, this.size);
return this.elementData(index);
}
public E set(int index, E element) {
Objects.checkIndex(index, this.size);
E oldValue = this.elementData(index);
this.elementData[index] = element;
return oldValue;
}
}
可以看到,这个类的许多方法里面,都有一个E,这个E是就是泛型,它不是一个具体的类型,而是在new对象的时候,传入什么泛型,就是用什么泛型。
在类定义的时候,有:
ArrayList<E>
既然定义的时候是E,下面的方法里也是E,那么,在初始化ArrayList的时候,传入什么泛型,下面的E就会变化成什么泛型,比如
ArrayList<String> stringList = new ArrayList<String>;
此时传入的是String,那么上面的代码,等同于发生了如下变化:
// 所有的 E 都被替换为特定的类型
public class ArrayList<String> extends AbstractList<String> implements List<String>, RandomAccess, Cloneable, Serializable {
public String get(int index) {
Objects.checkIndex(index, this.size);
return this.elementData(index);
}
public String set(int index, String element) {
Objects.checkIndex(index, this.size);
String oldValue = this.elementData(index);
this.elementData[index] = element;
return oldValue;
}
}
此时,这个被new出来的集合对象,就只能处理字符串类型的数据了。
(有没有感觉像函数重载?泛型就可以想象成类的重载,而且不用手动写重载代码)
知道了泛型的原理,也就很容易明白一个道理:
泛型并非只能用于数组和集合中,我们也可以创建使用泛型的类,只不过由于Java的API很丰富,没有必要再去自己写了。
(3)使用 尖括号 <> 操作符 (The diamond operator )表示泛型, 尖括号内可以放置大写字母 (代表一个未知类型) 或问号 ? (代表若干个类型)作为参数。比如,习惯上选择以下字母代表某种类型:
- T 意味某种类型
- E 意味 链表、数组里的元素,如List<E> list 表示 list 里的元素。
- K意味map(k,v) 里的键值 Key
- V 意味 返回或映射的值
(4)泛型的运用要受到如下限制 :
- 不能使用基本类型的类型参数,可以使用其包装类型代替。
- 静态成员无法使用类型参数。
- 不能使用泛型类异常
- 不能实例化泛型对象或数组,如:
T t = new T(); T[] a=new T; ×是错误的
5,. 不能使用泛型数组,如:
import java.util.*;
public class Test{
public static void main(String args[]){
List<String> arr[] = new ArrayList<String>[5];
}
}
D:\java\test\OS_China\generic>javac Test.java
Test.java:5: 错误: 创建泛型数组
List<String> arr[] = new ArrayList<String>[5];
^
1 个错误
至于代表若干类的,放在尖括号内的 通配符 ?:<?>,还分 上限通配符 (Upper Bounded Wildcards) 和 下限通配符 (Lower Bounded Wildcards)。
4, @Build使用
一开发说项目报错
java.lang.Long,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer,java.lang.Integer,java.util.Date,java.util.Date,java.lang.Integer,java.lang.Integer,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.Integer
原因: 实际参数列表和形式参数列表长度不同,看报错信息指向
@Builder
奇怪了,怎么builder会报错?
看报错信息说是匹配不到全参数的构造函数,因为项目用的是lombok,我的注解如下
-
@Data
-
@NoArgsConstructor
-
@Builder
已经有默认构造参数了,怎么还会报错?猜想难道builder默认用的是全参数构造函数?尝试加了@AllArgsConstructor
,果然好了。上网查了下资料
-
The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class that contains a member which is annotated with @Builder.生成器注释为被注释的类或包含用@Builder注释的成员的类创建所谓的“生成器”方面
-
If a member is annotated, it must be either a constructor or a method. If a class is annotated, then a private constructor is generated with all fields as arguments (as if @AllArgsConstructor(AccessLevel.PRIVATE) is present on the class), and it is as if this constructor has been annotated with @Builder instead.如果对成员进行了注释,则它必须是构造函数或方法。如果一个类被注释,则会生成一个私有构造函数,其中所有字段都作为参数(就像@AllArgsConstructor(AccessLevel.PRIVATE)存在于类上一样),而且就好像这个构造函数已经用@Builder注释了。
-
The effect of @Builder is that an inner class is generated named TBuilder, with a private constructor. Instances of TBuilder are made with the method named builder() which is also generated for you in the class itself (not in the builder class).@Builder的效果是生成一个名为TBuilder的内部类,带有一个私有构造函数。TBuilder的实例是使用名为builder()的方法创建的,该方法也是在类本身(而不是在生成器类中)中为您生成的。
-
The TBuilder class contains 1 method for each parameter of the annotated constructor / method (each field, when annotating a class), which returns the builder itself. The builder also has a build() method which returns a completed instance of the original type, created by passing all parameters as set via the various other methods in the builder to the constructor or method that was annotated with @Builder. The return type of this method will be the same as the relevant class, unless a method has been annotated, in which case it'll be equal to the return type of that method.TBuilder类包含注释构造函数/方法的每个参数的1个方法(每个字段,在注释类时),该方法返回生成器本身。构建器还有一个构建()方法,该方法返回原始类型的已完成实例,该实例通过将通过构建器中的各种其他方法设置的所有参数传递给用@Builder注释的构造器或方法创建。此方法的返回类型将与相关类相同,除非方法已被注释,在这种情况下,它将等于该方法的返回类型。
发现它的实现方式是会对标注这个注解的类的所有成员变量,所以在使用@Builder构建的时候如果不显式的对某变量赋值的话默认就是null,因为这个变量此时是在Builder类里的,通过调用build()方法生成具体T类则是通过私有构造函数来实例化,默认是全参数的构造函数。
@Builder默认的实现方式是在类上添加@AllArgsConstructor(access = AccessLevel.PACKAGE)
5,spring容器启动失败
Error creating bean with name 'jsonRedisCacheHandlerImpl' :
Unstatisfied dependency expressed through field 'residTemplate'
因为docker里面的redis服务没拉起来!!
6,yaml书写时间Date怎么设置
ManageLoadingPage:
title: ManageLoadingPage
type: object
properties:
picUrl:
type: string
updateTime:
format: yyyy-mm-dd
createTime:
format: yyyy-mm-dd
operatorId:
type: integer
operatorName:
type: string
summary:
type: string
deleteFlag:
type: boolean
7,jacoco测试覆盖
8,docker起多个服务,端口冲突:把相应代码注释掉为true,跑完在改回来
9,llt中有mock数据(验证码),poatman怎么写
在redis中用一个工具类,mock一个验证码,即mock postman
10,上传文件用postman调试,消息头multipart/form-data
key:Content-Type value:multipart/form-data
11,入参尽量不修改,因为修改后,下面的代码可能还要用入参,此时入参已被污染
12,@Qualifier和@param
@param是给java中的变量起个别名,便于mapper中的sql语句使用,因为其识别不了java代码,所以其别名给sql语句使用
@qualifier 因为springboot 中的每个bean是单例模式,当系统识别到两个会报错,所以用@qualifier指定要用哪个
13,Spring事务
1,业务上需要两个表一起更新的时候最好加事务,单个表不用,数据库有默认的事务隔离
举例子,比如说转账, 从A账户转移到B账户, A减去金额,则同时B需要加上金额
在类似的场景下,涉及到两个表相关联的更新,要加上事务
但是千万注意!!!不要在耗时长的操作里面加事务,事务粒度也要适中
2,spring提供了@transactionTemplate 方法级别的事务注解,使用方便
14,大小端序
计算机的内部处理都是小端字节序。在计算机内部,小端序被广泛应用于现代 CPU 内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序。
深度剖析数据在内存中的存储(原码、补码、反码、大小端、面试题)_m0_49622667的博客-优快云博客
15,jvm内存和数据变量
16,以太网报,ARP,ICMP,DNS解析
以太网帧格式、ARP协议、DNS、ICMP协议_zhao_miao的博客-优快云博客文章目录1.以太网帧的格式2.ARP协议2.1 ARP协议的作用2.2 ARP数据报的格式1.以太网帧的格式源地址和目的地址是指网卡的硬件地址(也叫MAC地址),用来识别数据链路层中相应的结点,长度是48位即6个字节,是在网卡出厂时固定的帧协议类型字段有三种值,分别对应IP,ARP,RARP帧末尾是CRC校验码2.ARP协议2.1 ARP协议的作用ARP协议建立了主机IP地...
https://blog.youkuaiyun.com/zhao_miao/article/details/89646142
17,servlet:服务(serv)应用 (let)
18,OncePerRequestFilter
19.final和static
浅析Java中的final关键字 - Matrix海子 - 博客园 (cnblogs.com)https://www.cnblogs.com/dolphin0520/p/3736238.html
编译是final修饰的如有值,则运行时认为是常量,未知值则和未被final修饰的一样,运行时才分配。
20,QPS,TPS是什么?
QPS:全名 Queries Per Second,意思是“每秒查询率”,是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
简单的说,QPS = req/sec = 请求数/秒。它代表的是服务器的机器的性能最大吞吐能力。
在网上,我看到有人在介绍 QPS 时,这样说:QPS 代表的是单个进程每秒请求服务器的成功次数。
但是 QPS 在百度百科中或维基百科中并没有强调单个进程,它主要是强调服务器的处理能力。
服务器的 QPS 一般我们可以使用 http_load 来测试,统计处 web 服务器的吞吐量和负载。
TPS 即 Transactions Per Second 的缩写,每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。
客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分。
TPS 的过程包括:客户端请求服务端、服务端内部处理、服务端返回客户端。
Qps 基本类似于 Tps,但是不同的是,对于一个页面的一次访问,形成一个 Tps;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“Qps”之中。
例如,访问一个 Index 页面会请求服务器 3 次,包括一次 html,一次 css,一次 js,那么访问这一个页面就会产生一个“T”,产生三个“Q”。
PV(page view)即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。
PV 即 page view,页面浏览量。用户每一次对网站中的每个页面访问均被记录 1 次。用户对同一页面的多次刷新,访问量累计。
根据这个特性,刷网站的 PV 就很好刷了。与 PV 相关的还有 RV,即重复访问者数量(repeat visitors)。
UV 访问数(Unique Visitor)指独立访客访问数,统计 1 天内访问某站点的用户数(以 cookie 为依据),一台电脑终端为一个访客。
可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的 cookies 实现的。如果更换了 IP 后但不清除 cookies,再访问相同网站,该网站的统计中 UV 数是不变的。如果用户不保存 cookies 访问、清除了 cookies 或者更换设备访问,计数会加 1。00:00-24:00 内相同的客户端多次访问只计为 1 个访客。根据这个特性,如果有人让你刷 UV,也很好的刷!
IP(Internet Protocol)独立 IP 数,是指 1 天内多少个独立的 IP 浏览了页面,即统计不同的 IP 浏览用户数量。同一 IP 不管访问了几个页面,独立 IP 数均为 1;不同的 IP 浏览页面,计数会加 1。IP 是基于用户广域网 IP 地址来区分不同的访问者的,所以,多个用户(多个局域网 IP)在同一个路由器(同一个广域网 IP)内上网,可能被记录为一个独立 IP 访问者。如果用户不断更换 IP,则有可能被多次统计。
GVM:所谓的 GMV,是 Gross Merchandise Volume 的简称。只要是订单,不管消费者是否付款、卖家是否发货、是否退货,都可放进 GMV 这个“大箩筐”里。
电商是很在意 GMV 的,拼多多的优惠券事故,估计就能产生不少 GMV。
根据 GMV 的统计方法,如果有人让你帮忙刷 GMV,你就可以一直下单,然后一直退款。
RPS 代表吞吐率,即 Requests Per Second 的缩写。吞吐率是服务器并发处理能力的量化描述,单位是 reqs/s,指的是某个并发用户数下单位时间内处理的请求数。
某个并发用户数下单位时间内能处理的最大的请求数,称之为最大吞吐率。
有人把 RPS 说等效于 QPS。其实可以看作同一个统计方式,只是叫法不同而已。RPS/QPS,可以使用 apche ab 工具进行测量。