@[TOC](目录)
# 0. idea 常用快捷键
选中 shift+Tab 取消缩进
选中 Tab 缩进
选中 ctrl / 注释
**一、Ctrl+按键**
1.Ctrl + F 文本查找
2.Ctrl + R 文本替换
3.Ctrl + Z 撤销
4.Ctrl + Y 删除光标所在行或者与Ctrl + Z操作相反(可设置)
5.Ctrl + D 复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面
6.Ctrl + W 递进式选择代码块
7.Ctrl + / 注释
8.Ctrl + C 复制
9.Ctrl + V 粘贴
**二、Shift+按键**
1.Shift + F10 运行
2.Shift + F9 Debug
3.Shift + Tab 取消缩进
4.Shift + F6 重命名
**三、Ctrl + Alt + 按键**
1.Ctrl + Alt + L 格式化代码
2.Ctrl + Alt + 左方向键 退回到上一个操作的地方
3.Ctrl + Alt + 右方向键 前进到上一个操作的地方
**四、Ctrl + Shift**
1.Ctrl + Shift + F 根据输入内容查找整个项目
2.Ctrl + Shift + R 根据输入内容替换对应内容
3.Ctrl + Shift + J 自动将下一行合并到当前行末尾
4.Ctrl + Shift + Z 取消撤销
5.Ctrl + Shift + Backspace 退回到上次修改的地方
# 1. 基础语法
package:package 语句应该放在源文件的第一行,在每个源文件中只能有一个包定义语句,并且 package 语句适用于所有类型(类、接口、枚举和注释)的文件。定义包语法格式如下:
class:用于定义一个类。
public:用于声明公共的访问级别,表示对所有类可见。
private:用于声明私有的访问级别,表示只有在同一类中可见。
static:用于声明静态成员,可以在没有创建对象的情况下访问。使得非静态类更适合用于表示具有多个实例的对象,例如用户、订单等。
void:用于表示方法没有返回值。
final:用于声明最终的变量,表示不能再修改其值。
if/else:用于条件语句,根据条件执行不同的代码块。
for/while/do-while:用于循环语句,重复执行一段代码块。
try/catch/finally:用于异常处理,捕获并处理异常。finally 是否发生异常都执行。
new:用于创建对象实例。
this:访问当前对象或类中的成员变量和方法,例如访问this.name、this.age等成员变量,或者调用this.method()等方法。
关键字implements是一个类,实现一个接口用的关键字,它是用来实现接口中定义的抽象方法。实现一个接口,必须实现接口中的所有方法。使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)
还有几点需要注意:
(1)接口可以被多重实现(implements),抽象类只能被单一继承(extends)
(2)接口只有定义,抽象类可以有定义和实现
(3)接口的字段定义默认为:public static final, 抽象类字段默认是”friendly”(本包可见)
## 1.1 逻辑运算符
&& 且 || 或
! 的优先级别高(先执行!后执行&& ||)
## 1.2 继承
`public class 子类 extends 父类{}`
## 1.3 静态类static
```bash
static内部类意味着:
(1) 为创建一个static内部类的对象,我们不需要一个外部类对象。
(2) 不能从static内部类的一个对象中访问一个外部类对象.
倘若为了创建内部类的对象而不需要创建外部类的一个对象,**也就是内部类中不需要访问外部类中的属性和方法**,那么可将所有东西都设为 static。为了能正常工作,同时也必须将内部类设为static。
此外,也可考虑用一个static内部类容纳自己的测试代码。
```
```bash
java中static用法总体来看可以归纳为3种,第一是修饰变量,第二是修饰方法,第三是代码块。
第一,被static修饰的变量叫做静态变量,其两大用法是可以被所有类对象共享值并且不可随意改变,另外可以用 类名.变量名的方式调用。
其内存加载时跟随类的加载一同加载的。
第二,被static修饰的方法叫做静态方法,首先静态太方法中可以调用静态方法,不可以调用非静态的方法,同样可以使用 类名.方法名 的方式调用。静态方法中不可以使用this和super不可以直接访问所属类的实例变量和实例方法可以直接访问类的静态变量和静态方法,其内存加载时也是跟随类的加载一同加载的。
第三,被static修饰的代码块,当程序中有多个静态代码块时,程序会依次向下执行,按照顺序加载,并且每一个静态方法块只可以执行一次。
总结:
用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键
```
静态内部类和静态外部类区别?
静态类和服务类区别?
服务类的注解和非服务类注解,非服务类不需要调用?
## 1.4 抛出异常
![异常图](https://img-blog.csdnimg.cn/7db746e2911344bdaa431bbff71ce96b.png)
- RuntimeException,代码本身存在BUG,而且,处理RuntimeException,不是try-catch能解决的。try-catch在这里使用毫无意义。try-catch用在这里作用就是代码运行过程中,不会直接在界面产生令人恐慌的错误,因为catch后已经给出产生错误后要输出的结果。但是bug依旧存在。处理RuntimeException使用抛出异常,throws(方法)或者throw(代码块),交给jvm来处理
- 不是RuntimeException,就是编译时异常。比如你在处理文件流时的I/O问题和SQL异常,就属于编译时异常。这个时候用try{}catch 来捕获或者 throws即可。编译时异常其实是可以这么理解:你的代码本身没有问题(运行时异常是你的代码本身有问题),但是代码里如果含有处理文件流(这里只是举个例子,还有很多类似的其它的情况)的时候,java规定,遇到这种情况,必须要在代码里强制抛出可能遇到的文件流异常,你可以在方法开头就throws,或者在catch后面进行捕获。其实代码本身逻辑跟语法都是没问题,但是文件流这种操作本身会存在潜在的问题与风险,这种问题是与你的代码无关的,java会强制要求在代码里作出预期处理。也就是刚才说的要么在方法开头就throws可能遇到的文件异常,要么就去catch后面捕获具体的文件异常。如果你在代码里不做这样的处理,运行代码后,控制台就会输出错误。代码一样跑不起来。
### 1.4.1 throw
这里不行这里报错,不终止全部程序。
throw: 指的是在方法之中人为抛出一个异常类对象,这个对象可以是自己实例化,或者是已经存在的。
throws: 指的是在方法的声明上使用,表示此方法在调用时必须处理异常。
方法后边加上throws Exception的作用是抛出异常。其中Exception可以理解为所有异常,也可以抛出指定异常。如果方法后边不加throws Exception,方法出了异常就会向上传递抛出(如果方法有调用者,那就交给调用者处理,如果调用者继续一层层抛出,最终交给虚拟机,虚拟机处理,整个程序会中断! 如果在程序中捕获 还可以继续进行)
### 1.4.2 Exception 常见异常
Throwable:是异常Exception与Error的父类,直接继承自Object, Error通常指系统发生的严重性的错误,不能通过程序代码解决的问题。
Exception是程序本身能够处理的异常,如:
1、ArrayIndexOutOfBoundsException:数组索引越界异常
通常原因:你访问了不存在的索引
2、NullPointerException:空指针异常
通常原因:数组已经不在指向堆内存了,而你还用数组名去访问元素。
3、RuntimeException:运行时异常
通常原因:表示你的代码本身存在BUG
详细解决方案:https://zhidao.baidu.com/question/329849523.html
4、ArithmeticException:算数异常(算术错误情形,如以零作除数)
通常原因 :当我们定义的除数为整数时(short、int、long)会抛出此异常,被除数为整数时不可为零
5、IllegalArgumentException:非法数据异常
通常原因:字面 非法参数 通常情况为找不到文件;有可能是没有通常是没编译,不排除其他情况
6、ClassNotFoundException:类无法加载异常
通常原因:类不能找到,一般原因都是部署的项目文件中没有这个类包
详细解决方案:https://www.cnblogs.com/xiangkejin/p/8798859.html
7、NumberFormatException:字符串到float类型转换异常
通常原因:数字格式异常
8、IOException:输入输出异常
通常原因:读写异常,一般在读写数据的时候会出现这种问题
9、FileNotFoundException:找不到文件异常
通常原因:路径配置错误 ;编译有问题,文件不存在
10、EOFException:文件结束异常
通常原因:当输入过程中意外到达文件或流的末尾时,抛出此异常
详细解决方案:https://www.cnblogs.com/yiwangzhibujian/p/7107084.html
11、InterruptedException:(线程)中断异常
通常原因:请查看下行链接
详细解决方案:https://www.jianshu.com/p/a8abe097d4ed
12、IndexOutOfBoundsException:索引超范围异常
通常原因:通常是指数组下标越界异常
13、NegativeArraySizeException:创建一个大小为负数的数组错误异常
通常原因:如果应用程序试图创建大小为负的数组,则抛出该异常
14、ClassCastException:两个类型间转换不兼容异常
通常原因:(1)一个类是数字类,而由于误操作,错误的将数字类向数字类转换改写成了数字类向字符串类的转换,从而产生了异常。
(2)大部分原因是因为强制转换或者是SQL映射时发生了这个异常。
15. SQLException:提供关于数据库访问错误或其他错误信息的异常。
### 1.4.3 try catch
在一个 try 语句中,程序执行一段代码,如果发生了异常,则会被捕获,并转到相应的 catch 语句中进行处理。
```bash
try {
int result = pide(10, 0);
System.out.println(result);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
```
## 1.5 获取数据方式
get:从里面拿
post:往里面放
put:
delete:删除
post 不需要传入
新增 insert,修改update,
## 1.6 泛型
List指的是集合.<>是泛型,里面指定了这个集合中存放的是什么数据。
1. 集合可以有List、vector、set、map等。
2. 这些集合有啥用呢,就好比你有一堆数据要存:
[name='张三' , age=20, address='北京']
[name='李四' , age=15, address='湖南']
[name='王五' , age=18, address='甘肃']等等,
这样一条一条的数据你就能够用集合来保存起来,放到一条集合中去
3. 例如用list来保存,保存形式就如下:
list = {[name='张三' , age=20, address='北京'], [name='李四' , age=15, address='湖南'] , [name='王五' , age=18, address='甘肃']};
这样的形式了,然后取值的时候你就可以根据 **list.get(i)** 来分别取值了。
4. 如果要取到每一条里面的属性,那么可以配合map或者存储的是实体类对象,来分别取值就对了,非常的简单且实用
```java
List<Person> list = new ArrayList<Person>();
...
list.get(0).getName();
```
## 1.7 全量/增量
全量:数据库里面全部数据,取出来的时候删掉之前的直接放新的
增量:数据库中新增加的,取数,不删掉之前的,直接放新的
## 1.8 cron 表达式
![在这里插入图片描述](https://img-blog.csdnimg.cn/41e030b8bb084ea7846727ead63f7f4f.png)
## 1.9 steam 用法
### 1.9.1 创建方法
### 1.9.2 使用Arrays 中的 stream() 方法,将数组转成流
```bash
Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);
```
### 1.9.3 中间操作
```java
// 1. 筛选与切片
filter():过滤流中的某些元素
limit skip distinct sorted 都是有状态操作,这些操作只有拿到前面处理后的所有元素之后才能继续下去。
limit(n):获取前n个元素
skip(n):跳过前n元素,配合limit(n)可实现分页
distinct:通过流中元素的 hashCode() 和 equals() 去除重复元素
// 2. 映射
map():接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap():接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
// 3. 消费 peek , 类似map,
map()接收的是一个Function表达式,有返回值;
peek()接收的是Consumer表达式,没有返回值。
// 4. 排序
sorted():自然排序,流中元素需实现Comparable接口
sorted(Comparator com):定制排序,自定义Comparator排序器
```
### 1.9.4 其他方法
```java
// 匹配和聚合
allmatch,noneMatch,anyMatch用于对集合中对象的某一个属性值是否存在判断。
allMatch()全部符合该条件返回true,
noneMatch()全部不符合该断言返回true
anyMatch()任意一个元素符合该断言返回true
// 实例:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = list.stream().allMatch(e -> e > 10); //false
boolean noneMatch = list.stream().noneMatch(e -> e > 10); //true
boolean anyMatch = list.stream().anyMatch(e -> e > 4); //true
// 其他一些方法
findFirst():返回流中第一个元素
String firstMatchedName = memberNames.stream().filter((s) -> s.startsWith("L"))
.findFirst().get();
findAny():返回流中的任意元素
count():返回流中元素的总个数
long totalMatched = memberNames.stream().filter((s) -> s.startsWith("A")).count();
max():返回流中元素最大值
min():返回流中元素最小值
```
### 1.9.5 filter()、map()、foreach()区别
map() 方法的作用是对流中的每个元素进行处理,并返回处理后的新元素,
foreach() 方法的作用是遍历流中的每个元素,不返回任何值。在实际使用中,需要根据具体的需求选择使用哪种方法。
使用 filter() 方法可以从流中过滤出符合条件的元素,返回的是一个新的流,因此在使用过滤后的流时需要注意资源的释放。
## 1.10 java接口类的写法
```java
public String validatedDemo1(@Validated @RequestBody Use1Dto use1Dto)
```
这是一个Java类中的方法,它接受一个名为"use1Dto"的参数,参数类型为"Use1Dto",并将其标记为"Validated"和"RequestBody"注解。"Validated"注解表示参数应该使用验证框架进行验证,而"RequestBody"注解则表示参数应该来自请求体。
## 1.11 return 用法
1. return在method的最后一行
最后一行的return可写可不写,如果写就写成“return;”,返回类型为空。
2. return在method的中间
在中间的情况表示退出method的意思,后面的代码就不执行了。又想抛出异常又想继续执行就抛出异常throws。
## 1.12 判断字符串为空的三种情况
null,“”,“ ”
1. 直接判断
```java
str == null || str.trim().length()== 0
```
2. 借助 StringUtils 判断
```java
StringUtils.isEmpty(xxx)
/*
* StringUtils.isEmpty(null) = true
* StringUtils.isEmpty("") = true
* StringUtils.isEmpty(" ") = false
* StringUtils.isEmpty("bob") = false
* StringUtils.isEmpty(" bob ") = false
* /
```
```java
StringUtils.isBlank(xxx)
/*
* StringUtils.isBlank(null) = true
* StringUtils.isBlank("") = true
* StringUtils.isBlank(" ") = true
* StringUtils.isBlank("bob") = false
* StringUtils.isBlank(" bob ") = false
* /
```
## 1.13 判断集合为空
CollectionUtils.isEmpty()
List.isEmpty()发现当list为null的时候,list.isEmpty是会报空指针的,而CollectionUtils.isEmpty则不会。
map.size()>0
map!=null
## 1.14 需要判空
java字段为null时,get取值会出现java.lang.NullPointException异常
stream的list需要非空
# 2. 接收前端数据(controller)
## 2.1 @GetMapping
是Spring4.3提供的新注解,它是一个组合注解,等价于@RequestMapping(method = RequestMethod.Get ),用于简化开发,注意:@RequestMapping如果没有指定请求方式,将接收Get、Post、Head、Options等所有的请求方式.同理还有@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping等
## 2.2 @Autowired
注入(相当于python中的import库,多了一步操作)
## 2.3 RestController
RestController的作用相当于Controller加ResponseBody共同作用的结果,但采用RestController请求方式一般会采用Restful风格的形式。
Controller的作用:声明该类是Controller层的Bean,将该类声明进入Spring容器中进行管理
collection 包括 List(列表),Set(集合),Queue(队列)
collection<?> coll
## 2.4 copyProperties(a,b)
是把a复制给b
主要针对对象的复制,list之类的复制直接用=
想 list 中每个实例都转换成别的实体类,可以循环使用copyProperties
## 2.5 @Validated
@Valid和@Validated是Spring Validation框架提供的参数验证功能。
1.@Valid和@Validated的用法(区别)
二者主要作用在于 都作为标准JSR-303规范,在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同:
@Valid:
@Valid注解用于校验,所属包为:javax.validation.Valid。
用在方法入参上无法单独提供嵌套验证功能。**能够用在成员属性(字段)**上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。
@Validated:
@Validated是@Valid 的一次封装,是Spring提供的校验机制使用。
用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。
(1)@Valid 和 @Validated 两者都可以对数据进行校验,待校验字段上打的规则注解(@NotNull, @NotEmpty等)都可以对 @Valid 和 @Validated 生效;
(2)@Valid 进行校验的时候,需要用 BindingResult 来做一个校验结果接收。当校验不通过的时候,如果手动不 return ,则并不会阻止程序的执行;
(3)@Validated 进行校验的时候,当校验不通过的时候,程序会抛出400异常,阻止方法中的代码执行,这时需要再写一个全局校验异常捕获处理类,然后返回校验提示。
(4)总体来说,@Validated 使用起来要比 @Valid 方便一些,它可以帮我们节省一定的代码,并且使得方法看上去更加的简洁。
## 2.6 @PathVariable
@PathVariable可以使请求参数动态的绑定到URL上,但是如果请求参数中包含特殊字符,比如 /,就可能导致Spring匹配到一个错误的URL,或者匹配不到合适的URL。
```java
@RequestMapping("/viewUser/{id}/{name}")
public Map<String, Object> viewUser(@PathVariable("id") Integer idInt, @PathVariable Integer name) {
System.out.println("@PathVariable中 请求参数 id = " + idInt);
Map<String, Object> user = new HashMap<>();
user.put("id", idInt);
user.put("name", name);
return user;
}
```
### @RequestParam和@PathVariable的区别
#### 使用方法
```java
一: RequestParam使用案例:
@RequestParam(value = "param",required = false,defaultValue = "test")String param
参数解析:
value/name: URL中需要获取的参数名称
required: true/false,为true时,url中必须携带这个参数(否则会出现: Required String parameter XXX is not present"),为false时,可以选填这个参数。
defaultValue:默认值,如果这个url没有携带这个参数时,默认设置的值。
? 后面显示参数
二: PathVariable使用案例:
@RequestMapping("/pathVariable/test/{param}")
@PathVariable(value = "param",required = false)String param
参数解析:
1、name/value:RequestMapping注解中url路径绑定参数的名称,如/pathVariable/test/{param},则name的值就为param
2、required: 为true时,这个参数必选填写,默认是true,为false时:参数可选是否填写
```
#### 结果示例
![在这里插入图片描述](https://img-blog.csdnimg.cn/a4592d5c70b44e3a8044ac87e249059c.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2c53c9a684944846a600c4d58d71f0d9.png)
# 3. mybatis-plus
## 3.1 Wrapper 家族
### 3.1.1 QueryWrapper(条件构造器)
常见用法:用来查询id等
![在这里插入图片描述](https://img-blog.csdnimg.cn/75dab6497ebc4729a42a80428a6d740b.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/530a9819f20242fda6483b71cb630f81.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/df7f37d04c4340929b1578bc9bdbeabf.png)
## 3.2 获取和赋值
get 参数名 获取
set 参数名 赋值
## 3.3 AjaxResult
SpringBoot通用返回类AjaxResult用来返回状态码信息以及提示信息(AjaxResult),以便于浏览器端进行异步数据处理。其中,code表示请求的返回状态码,message表示请求返回的消息提示,data则表示请求返回的数据。
AjaxResult的使用方法非常简单,只需要在Controller中将需要返回的数据,封装到AjaxResult对象中即可。下面是一段例子代码:
```java
@RequestMapping("/demo")
@ResponseBody
public AjaxResult demo() {
User user = new User();
user.setName("Test");
user.setAge(18);
return AjaxResult.success(user);
}
```
## 3.4 ServiceImpl
ServiceImpl 类是我们进行SQL操作中非常重要的一个类,通过MybatisPlus生成的各个实体类的 XXXImpl 都会继承 ServiceImpl 类那里继承全部的方法。
## 3.5 ****接口
两种保存方式:save,batchsave
# 4. service 层
## 注解
首先了解一下IOC操作Bean管理,bean管理是指(1)spring创建对象 (2)spring注入属性。当我们在将一个类上标注@Service或者@Controller或@Component或@Repository注解之后,spring的组件扫描就会自动发现它,并且会将其初始化为spring应用上下文中的bean。 而且初始化是根据无参构造函数。
### 1. 重写@Override
告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次,是伪代码,表示重写(当然不写也可以),不过写上有如下好处:
1>可以当注释用,方便阅读
2>编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错
### 2. 服务类@ service
定义成服务类之后才能用 import 加载进来。
重写service 中定义的服务类时候要用 @Autowired
普通类通常用于实现一些基本的功能,例如表示一个物品、一个动作等。它们通常没有特定的生命周期,可以在程序的任何地方被创建和使用。普通类不具备特定的服务功能,也不需要被其他类所依赖。(不能import?)
相比之下,服务类通常用于提供一些特定的服务,例如数据库访问、文件读写等。它们通常具有特定的生命周期,在程序的某些特定时刻被创建和使用。服务类需要被其他类所依赖,以便其他类能够使用它们提供的服务。
举🌰:
```java
// 构建服务类
@Data
@Service
public class AutoWiredBean {
private int id;
private String name;
public AutoWiredBean(){
System.out.println("无参构造函数");
}
public AutoWiredBean(int id, String name) {
this.id = id;
this.name = name;
System.out.println("有参构造函数");
}
}
```
```java
// 应用类
@SpringBootTest
@RunWith(SpringRunner.class)
class Springboot02WebApplicationTests {
private AutoWiredBean autoWiredBean;
@Autowired
public Springboot02WebApplicationTests (AutoWiredBean autoWiredBean){
this.autoWiredBean = autoWiredBean;
}
@Test
void contextLoads() {
System.out.println(autoWiredBean);
System.out.println(autoWiredBean.getId()); //0
System.out.println(autoWiredBean.getName()); //null
}
}
```
### 3. 工厂方法
工厂方法模式是一种设计模式,它的作用是将对象的创建和使用分离开来,从而使得程序更加灵活、可维护。在工厂方法模式中,我们通常会定义一个抽象的工厂类,该类中包含一个静态的方法,用于根据输入参数创建相应的对象。
### 4. BeanUtils.copyProperties的用法
`BeanUtils.copyProperties(a, b);` 把a复制给b
1. b中的存在的属性,a中一定要有,但是a中可以有多余的属性;
2. a中与b中相同的属性都会被替换,不管是否有值;
3. a、 b中的属性要名字相同,才能被赋值,不然的话需要手动赋值;
4. Spring的BeanUtils的CopyProperties方法需要对应的属性有getter和setter方法;
5. 如果存在属性完全相同的内部类,但是不是同一个内部类,即分别属于各自的内部类,则spring会认为属性不同,不会copy;
6. spring和apache的copy属性的方法源和目的参数的位置正好相反,所以导包和调用的时候都要注意一下。
### 5. @Component
@Component注解是Spring框架中的一个通用注解,它可以用于标注任何类型的Bean,包括普通类、抽象类、接口等。当一个Bean被标注了@Component注解后,Spring容器就会自动为它创建一个实例,并将其注册到容器中。其他的Bean可以通过@Autowired注解来注入这个组件,从而使用它提供的服务。
@Service注解是Spring框架中的一个特定的注解,它用于标注一个Bean是一个服务类(Service)。当一个Bean被标注了@Service注解后,Spring容器就会自动为它创建一个实例,并将其注册到容器中。其他的Bean可以通过@Autowired注解来注入这个服务类的实例,从而使用它提供的服务。
总之,@Component和@Service都是Spring框架中的注解,它们都用于标注一个Bean是一个组件或服务类。但是,它们的作用和使用方式略有不同。@Component注解可以用于标注任何类型的Bean,而@Service注解只能用于标注服务类。另外,@Component注解可以被其他注解或XML配置文件所替代,而@Service注解则不能被其他注解或XML配置文件所替代。
### 6. @Value
@Value注解是Spring框架中的一个注解,它用于将外部配置文件中的属性值注入到Bean中。当一个Bean被标注了@Value注解后,Spring容器就会自动为它注入外部配置文件中指定的属性值。
```java
@Value("${my.property}")
private String myProperty;
public String getMyProperty() {
return myProperty;
}
```
在上面的代码中,我们使用@Value注解来将外部配置文件中指定的属性值“my.property”注入到myProperty字段中。当我们需要获取该属性值时,我们可以通过getMyProperty方法来获取它。
需要注意的是,@Value注解中的属性值可以使用占位符来指定。占位符是一种特殊的字符串,它用于表示配置文件中的某个属性值。例如,${my.property}就是一个占位符,它表示配置文件中名为“my.property”的属性值。
总之,@Value注解是Spring框架中的一个注解,它用于将外部配置文件中的属性值注入到Bean中。当一个Bean被标注了@Value注解后,Spring容器就会自动为它注入外部配置文件中指定的属性值。@Value注解中的属性值可以使用占位符来指定,从而使得我们可以更加灵活地使用它来注入属性值。
# 5. Dao 层(与数据库交互)
定义新用数据的方法在这写
## 5.1 mybatis-plus中BaseMapper
集成增删改查的功能
## 5.2 @Param
1.便于传递多个参数
(1)Mapper层
```java
Integer updatePasswordByUid( //根据uid更新用户密码
@Param("uid") Integer uid,
@Param("password") String password,
@Param("modifiedUser") String modifiedUser,
@Param("modifiedTime") Date modifiedTime);
```
(2)对应的mapper.xml
```java
<update id="updatePasswordByUid">
update t_user
set password=#{password},
modified_user=#{modifiedUser},
modified_time=#{modifiedTime}
where uid = #{uid}
</update>
```
注意:如果不使用@Param注解时,参数则只能有一个;如果还想引用多个参数,参数可以设置为JavaBean
```bash
public List<Role> findRoleByMix(@Param("roleP") RoleParam role, @Param("permissionP") PermissionParam permission);
```
```bash
<select id="findRoleByMix" resultType="role">
SELECT id,name FROM t_role
WHERE roleName=#{roleP.roleName}
AND note=#{rolep.note}
AND level=#{permissionP.level}
<select>
```
2.起别名的功能
(1)数据库中字段为:user_name、user_password;
(2)pojo类中字段为:name、password;
(3)传参时别名字段为:userName,userPassword
```java
Integer updatePasswordByUsername(
@Param("password") String userPassword,
@Param("name") String userName);
```
```java
<update id="updatePasswordByUsername">
update t_user
set user_password=#{password}
where user_name = #{userName}
</update>
```
补充:@Param和@RequestParam是什么关系呢?
①@Param是地处Dao层,是为了传递多个参数,解决的是可读性和直观性
②而@RequestParam是位列Controller层,作用是为获取前端参数,解决的是前后端参数不一致的问题
# 6. ELK框架
[参考文章](https://blog.csdn.net/tuanzi_dd/article/details/121095257)
Elasticsearch:开源分布式搜索引擎,提供收集、分析、存储数据三大功能
- 特点:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful风格接口、多数据源、自动搜索负载
Logstash:用来做日志的收集、分析、过滤日志的工具,支持大量的数据获取方式。
- 工作方式:c/s架构,client端安装在需要收集日志的主机上,server端负责将收集到的各个节点的日志进行过滤、修改等操作,再一并发往elasticsearch上去。
## 6.1 es配置sql参数
ES指令
```bash
cmd命令初始化:npm install
cmd命令启动:npm run dev
```
## 6.2 logstash
### 6.2.1 数据读取
#### csv数据读取
![在这里插入图片描述](https://img-blog.csdnimg.cn/9fd19bb284274115afd062ca71d4c481.png)
```
input {
file {
#要读取的数据文件的路径
path => "D:/elk/logstash-7.6.1/config/TSI_DOC_TITLE_CONTENT_VIEW.csv"
start_position => "beginning"
}
}
filter {
csv {
#分隔符
separator => ","
#数据对应的字段名,顺序要和字段值一致
columns => ["TID","TNAME","TPARENT","DID","CONTENT"]
}
mutate{
#忽略某些字段
remove_field => ["@version","message","host","path","@timestamp"]
#类型
convert => {
"TID" => "string"
"TENAME" => "string"
"TPARENT" => "string"
"DID" => "string"
"CONTENT" => "string"
}
}
}
output {
elasticsearch {
#要写入的es地址
hosts => "http://localhost:9200"
#索引
index => "title"
#类型,6.X版本后的固定用这个
document_type => "_doc"
#定义文档id用表数据的主键,会方便核对数据
document_id =>"%{TID}"
}
stdout {}
}
```
cmd进入bin目录执行:`logstash -f data.conf`
#### 导入数据库数据
![在这里插入图片描述](https://img-blog.csdnimg.cn/9cf35ae9d9a44b2da73a815426535801.png)
```bash
input {
jdbc {
jdbc_driver_library => "d:/elk/logstash-7.6.1/lib/ojdbc6-11.2.0.2.0.jar"
jdbc_driver_class => "Java::oracle.jdbc.OracleDriver"
jdbc_connection_string => "jdbc:oracle:thin:@192.168.212.22:7210:chestnut"
jdbc_user => "chestnut"
jdbc_password => "chestnut1111"
schedule => "* * * * *"
statement_filepath => "d:/elk/logstash-7.6.1/sql/gettitlecontent.sql"
jdbc_page_size => "100000"
use_column_value => "true"
tracking_column => "tid"
codec => plain { charset => "UTF-8"}
jdbc_paging_enabled => true
}
}
filter {
mutate{
#忽略某些字段
remove_field => ["@version","message","host","path","@timestamp"]
}
}
output {
elasticsearch {
#要写入的es地址
hosts => "http://localhost:9200"
#索引
index => "title"
#类型,6.X版本后的固定用这个
document_type => "_doc"
#定义文档id用表数据的主键,会方便核对数据
document_id => "%{tid}"
}
stdout {}
}
```
cd到bin目录运行:`logstash -f getoracle.conf`
## 6.3 查询日志
idea 后端可以在开始的地方,通过git插入代码
vscode 前端通过 git 指令拉代码 git clone https://github.com/Eugene-Hung/Test.git,直到显示succeed。
前端通过ES的指令启动,只有把代码作为开头才能npm install 不能作为一个模块打开
!! 可以通过前端的network来看后端端口
通过传参看各个变量的定义
### logstach 配置文件
jdbc_page_size:sql语句分解为多个查询。每个查询将使用限制和偏移量来集体检索完整的结果集。限制大小通过设置 jdbc_page_size。
- 值类型是数字
- 默认值为 100000
# 7. idea的debug调试按钮使用
![在这里插入图片描述](https://img-blog.csdnimg.cn/faffaee6f2d647c4b0c6c3d75f3eac96.png)
# 8. Maven
![在这里插入图片描述](https://img-blog.csdnimg.cn/caa43c1457a64dd6bffe33536a50f7cd.png)
clean是清理
compile是编译:将主程序的.Java代码编译成.class文件
test是测试
package是打包
install是安装,将当前写好的项目打成jar包(传生产才需要打包)
![在这里插入图片描述](https://img-blog.csdnimg.cn/fc5dbdb31f4d4c57b600c142aa9cb66b.png)
target 里面放一些配置文件
# 9. 实体类存储数据库
1. 通过mybatis继承,实现简单的增删改查保存
2. 不行就dao层 xml写方法
# domain层(和数据库交互的实体类)
常用写法:
```java
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class *** implements Serializable
private static final long serialVersionUID = 1L;
```
## 序列化
看老员工写的代码中每个实体都进行了序列化:
private static final long serialVersionUID = 1L;
Serializable是一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才是可序列化的。因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化。
序列化的应用场景
1. 比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口。
2. 在进行Java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口。最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,这样做为的是将数据变为二进制来传输,所以可以在网络上传输。
3. 如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。
备注:
Serializable这个接口其实是个空接口。其实,看一下接口的注释说明就知道,当我们让实体类实现Serializable接口时,其实是在告诉JVM此类可被序列化,可被默认的序列化机制序列化,不需要我们实现。
## @Accessors
(1)该注解主要作用是:当属性字段在生成 getter 和 setter 方法时,做一些相关的设置。
(2)当它可作用于类上时,修饰类中所有字段,当作用于具体字段时,只对该字段有效
@Accessors(**chain=true**)
链式访问,该注解设置chain=true,生成setter方法返回this(也就是返回的是对象),代替了默认的返回void。
```bash
User user=new User().setAge(31).setName("pollyduan");//返回对象
```
@Accessors(fluent = true)
与chain=true类似,区别在于getter和setter不带set和get前缀。
```bash
User user=new User().age(31).name("pollyduan");//不需要写set
```
## @Data
相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
# 10. java项目重启
xml、java改完之后需要重启才生效(改啥都要重启)
java debug 断电可以随便打,不需要重启
# 11.接口测试
发送body时不需要发所有的属性,不发的会默认变成null
# 12. 接口冲突(kill用法)
## 12.1 kill 语法
```bash
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
```
> -l <信息编号> 若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
> -s <信息名称或编号> 指定要送出的信息。 [程序] 可以是程序的PID或是PGID,也可以是工作编号。
>
- 1 (HUP):重新加载进程。
- 9 (KILL):杀死一个进程。
- 15 (TERM):正常停止一个进程。
## kill -15和kill -9的区别
kill -15 pid 是在收到 signal 之后不是立马结束而是先处理完剩余的工作再去结束。
kill -9 pid 是在收到 signal 之后立马马下手上的工作结束当前的工作,并且这个操作是不计后果的。相当于断电了。
对于不同服务的影响(假设场景:张三在给李四转钱):
- InnoDB 引擎:没影响,因为它支持事务。
- MyISAM 引擎:张三钱转出去了,kill -9,李四没收到钱。
# 13. 数据库相关
## MySQL 常用指令
查一列不重复数据(需要查询所有代码指标时候用)
```java
SELECT DISTINCT column_name
FROM table_name;
```
## 数据库名词:事务
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
3 、隔离性。
一个事务的执行不能由其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性。
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关
MyISAM:不支持事务,用于只读程序提高性能
InnoDB:支持ACID事务、行级锁、并发
Berkeley DB:支持事务
一个事务是一个连续的一组数据库操作,对外就好像它是一个单一的工作单元进行。如果在事务的任何操作失败,则整个事务将失败。
打包失败报错
## linux 指令
### 查看指令
cat 从第一行开始显示档案内容。
tac 从最后一行开始显示档案内容。
more 分页显示档案内容。
less 与 more 类似,但支持向前翻页
head 只显示前面几行
tail 只显示后面几行 -f 该参数用于监视File文件增长
n 带行号显示档案内容
### 服务运行
```bash
# 查看所有服务现在运行状态
service --status-all
# 开启
service mysqld start
# 关闭
service mysqld stop
# 重启
service mysqld restart
```