目录
- 0. 基础语法
- 逻辑运算符
- 继承
- 静态类static
- 抛出异常
- throw
- Exception 常见异常
- try catch
- 获取数据方式
- 泛型
- 全量/增量
- cron 表达式
- steam 用法
- 创建方法
- 1-2 使用Arrays 中的 stream() 方法,将数组转成流
- 中间操作
- 其他方法
- 1. 接收前端数据(controller)
- mybatis
- 1. QueryWrapper
- 获取和赋值
- AjaxResult
- 2. service 层
- 注解
- 1. 重写@Override
- 2. 服务类@ service
- 3. 工厂方法
- 4. BeanUtils.copyProperties的用法
- 3. Dao 层(与数据库交互)
- 3.1 mybatis-plus中BaseMapper
- 4. ELK框架
- es配置sql参数
- logstash
- 数据读取
- csv数据读取
- 导入数据库数据
- 查询日志
- idea的debug调试按钮使用
- Maven
- 实体类存储数据库
0. 基础语法
class:用于定义一个类。
public:用于声明公共的访问级别,表示对所有类可见。
private:用于声明私有的访问级别,表示只有在同一类中可见。
static:用于声明静态成员,可以在没有创建对象的情况下访问。使得非静态类更适合用于表示具有多个实例的对象,例如用户、订单等。
void:用于表示方法没有返回值。
final:用于声明最终的变量,表示不能再修改其值。
if/else:用于条件语句,根据条件执行不同的代码块。
for/while/do-while:用于循环语句,重复执行一段代码块。
try/catch/finally:用于异常处理,捕获并处理异常。finally 是否发生异常都执行。
new:用于创建对象实例。
this:访问当前对象或类中的成员变量和方法,例如访问this.name、this.age等成员变量,或者调用this.method()等方法。
逻辑运算符
&& 且 || 或
! 的优先级别高(先执行!后执行&& ||)
继承
public class 子类 extends 父类{}
静态类static
static内部类意味着:
(1) 为创建一个static内部类的对象,我们不需要一个外部类对象。
(2) 不能从static内部类的一个对象中访问一个外部类对象.
倘若为了创建内部类的对象而不需要创建外部类的一个对象,**也就是内部类中不需要访问外部类中的属性和方法**,那么可将所有东西都设为 static。为了能正常工作,同时也必须将内部类设为static。
此外,也可考虑用一个static内部类容纳自己的测试代码。
java中static用法总体来看可以归纳为3种,第一是修饰变量,第二是修饰方法,第三是代码块。
第一,被static修饰的变量叫做静态变量,其两大用法是可以被所有类对象共享值并且不可随意改变,另外可以用 类名.变量名的方式调用。
其内存加载时跟随类的加载一同加载的。
第二,被static修饰的方法叫做静态方法,首先静态太方法中可以调用静态方法,不可以调用非静态的方法,同样可以使用 类名.方法名 的方式调用。静态方法中不可以使用this和super不可以直接访问所属类的实例变量和实例方法可以直接访问类的静态变量和静态方法,其内存加载时也是跟随类的加载一同加载的。
第三,被static修饰的代码块,当程序中有多个静态代码块时,程序会依次向下执行,按照顺序加载,并且每一个静态方法块只可以执行一次。
总结:
用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键
静态内部类和静态外部类区别?
静态类和服务类区别?
服务类的注解和非服务类注解,非服务类不需要调用?
抛出异常
- 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后面捕获具体的文件异常。如果你在代码里不做这样的处理,运行代码后,控制台就会输出错误。代码一样跑不起来。
throw
这里不行这里报错,不终止全部程序。
throw: 指的是在方法之中人为抛出一个异常类对象,这个对象可以是自己实例化,或者是已经存在的。
throws: 指的是在方法的声明上使用,表示此方法在调用时必须处理异常。
方法后边加上throws Exception的作用是抛出异常。其中Exception可以理解为所有异常,也可以抛出指定异常。如果方法后边不加throws Exception,方法出了异常就会向上传递抛出(如果方法有调用者,那就交给调用者处理,如果调用者继续一层层抛出,最终交给虚拟机,虚拟机处理,整个程序会中断! 如果在程序中捕获 还可以继续进行)
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:类无法加载异常
通常原因:类不能找到,一般原因都是部署的项目文件中没有这个类包
详细解决方案:
7、NumberFormatException:字符串到float类型转换异常
通常原因:数字格式异常
8、IOException:输入输出异常
通常原因:读写异常,一般在读写数据的时候会出现这种问题
9、FileNotFoundException:找不到文件异常
通常原因:路径配置错误 ;编译有问题,文件不存在
10、EOFException:文件结束异常
通常原因:当输入过程中意外到达文件或流的末尾时,抛出此异常
详细解决方案:
11、InterruptedException:(线程)中断异常
通常原因:请查看下行链接
详细解决方案:https://www.jianshu.com/p/a8abe097d4ed
12、IndexOutOfBoundsException:索引超范围异常
通常原因:通常是指数组下标越界异常
13、NegativeArraySizeException:创建一个大小为负数的数组错误异常
通常原因:如果应用程序试图创建大小为负的数组,则抛出该异常
14、ClassCastException:两个类型间转换不兼容异常
通常原因:(1).一个类是数字类,而由于误操作,错误的将数字类向数字类转换改写成了数字类向字符串类的转换,从而产生了异常。
(2).大部分原因是因为强制转换或者是SQL映射时发生了这个异常。
15. SQLException:提供关于数据库访问错误或其他错误信息的异常。
try catch
在一个 try 语句中,程序执行一段代码,如果发生了异常,则会被捕获,并转到相应的 catch 语句中进行处理。
try {
int result = pide(10, 0);
System.out.println(result);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
获取数据方式
get:从里面拿
post:往里面放
put:
delete:删除
post 不需要传入
新增 insert,修改update,
泛型
List指的是集合.<>是泛型,里面指定了这个集合中存放的是什么数据。
- 集合可以有List、vector、set、map等。
- 这些集合有啥用呢,就好比你有一堆数据要存:
[name=‘张三’ , age=20, address=‘北京’]
[name=‘李四’ , age=15, address=‘湖南’]
[name=‘王五’ , age=18, address=‘甘肃’]等等,
这样一条一条的数据你就能够用集合来保存起来,放到一条集合中去 - 例如用list来保存,保存形式就如下:
list = {[name=‘张三’ , age=20, address=‘北京’], [name=‘李四’ , age=15, address=‘湖南’] , [name=‘王五’ , age=18, address=‘甘肃’]};
这样的形式了,然后取值的时候你就可以根据 list.get(i) 来分别取值了。 - 如果要取到每一条里面的属性,那么可以配合map或者存储的是实体类对象,来分别取值就对了,非常的简单且实用
List<Person> list = new ArrayList<Person>();
...
list.get(0).getName();
全量/增量
全量:数据库里面全部数据,取出来的时候删掉之前的直接放新的
增量:数据库中新增加的,取数,不删掉之前的,直接放新的
cron 表达式
steam 用法
创建方法
1-2 使用Arrays 中的 stream() 方法,将数组转成流
Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);
中间操作
// 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排序器
其他方法
// 匹配和聚合
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. 接收前端数据(controller)
@GetMapping是Spring4.3提供的新注解,它是一个组合注解,等价于@RequestMapping(method = RequestMethod.Get ),用于简化开发,注意:@RequestMapping如果没有指定请求方式,将接收Get、Post、Head、Options等所有的请求方式.同理还有@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping等
@Autowired注入(相当于python中的import库,多了一步操作)
RestController的作用相当于Controller加ResponseBody共同作用的结果,但采用RestController请求方式一般会采用Restful风格的形式。
Controller的作用:声明该类是Controller层的Bean,将该类声明进入Spring容器中进行管理
collection 包括 List(列表),Set(集合),Queue(队列)
collection<?> coll
copyProperties(a,b)是把a复制给b
mybatis
1. QueryWrapper
Mybatis-plus 提供的动态条件查询(条件构造器)
常见用法:
用来查询id等
获取和赋值
get 参数名 获取
set 参数名 赋值
AjaxResult
SpringBoot通用返回类AjaxResult用来返回状态码信息以及提示信息(AjaxResult),以便于浏览器端进行异步数据处理。其中,code表示请求的返回状态码,message表示请求返回的消息提示,data则表示请求返回的数据。
AjaxResult的使用方法非常简单,只需要在Controller中将需要返回的数据,封装到AjaxResult对象中即可。下面是一段例子代码:
@RequestMapping("/demo")
@ResponseBody
public AjaxResult demo() {
User user = new User();
user.setName("Test");
user.setAge(18);
return AjaxResult.success(user);
}
2. 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
举🌰:
// 构建服务类
@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("有参构造函数");
}
}
// 应用类
@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
- b中的存在的属性,a中一定要有,但是a中可以有多余的属性;
- a中与b中相同的属性都会被替换,不管是否有值;
- a、 b中的属性要名字相同,才能被赋值,不然的话需要手动赋值;
- Spring的BeanUtils的CopyProperties方法需要对应的属性有getter和setter方法;
- 如果存在属性完全相同的内部类,但是不是同一个内部类,即分别属于各自的内部类,则spring会认为属性不同,不会copy;
- spring和apache的copy属性的方法源和目的参数的位置正好相反,所以导包和调用的时候都要注意一下。
3. Dao 层(与数据库交互)
定义新用数据的方法在这写
3.1 mybatis-plus中BaseMapper
集成增删改查的功能
4. ELK框架
参考文章 Elasticsearch:开源分布式搜索引擎,提供收集、分析、存储数据三大功能
- 特点:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful风格接口、多数据源、自动搜索负载
Logstash:用来做日志的收集、分析、过滤日志的工具,支持大量的数据获取方式。
- 工作方式:c/s架构,client端安装在需要收集日志的主机上,server端负责将收集到的各个节点的日志进行过滤、修改等操作,再一并发往elasticsearch上去。
es配置sql参数
ES指令
cmd命令初始化:npm install
cmd命令启动:npm run dev
logstash
数据读取
csv数据读取
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
导入数据库数据
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
查询日志
idea 后端可以在开始的地方,通过git插入代码
vscode 前端通过 git 指令拉代码 git clone https://github.com/Eugene-Hung/Test.git,直到显示succeed。
前端通过ES的指令启动,只有把代码作为开头才能npm install 不能作为一个模块打开
!! 可以通过前端的network来看后端端口
通过传参看各个变量的定义
idea的debug调试按钮使用
Maven
clean是清理
compile是编译:将主程序的.Java代码编译成.class文件
test是测试
package是打包
install是安装,将当前写好的项目打成jar包(传生产才需要打包)
target 里面放一些配置文件
实体类存储数据库
- 通过mybatis继承,实现简单的增删改查保存
- 不行就dao层 xml写方法