八股文题集

目录

                        

一、java基础

1.基本数据类型

2.jdk,jre,jvm,之间的关系

3.jvm的调优

4.gc的算法

5.类中元素储存位置

6. do-while while的区别

7.常用的循环有哪一些

8.break,continue,return的区别

9、switch() case中的表达式能是什么类型的

10.什么是递归:

11.String类的常用方法

12.String为什么是不可变对象

13. String为什么是final修饰的:

14. String和StringBulider的区别

15. StringBulider和StringBuffer,ArrayList和Vector,HashMap和Hashtable的区别

16.数组和集合的特点

17.数组和集合的转化

18. ArrayList和linkedList的底层实现和区别

 19.HashMap的底层

20.List和set的区别

21.怎么把集合变成线程安全的

22.Collections和Collection的区别,

23.Iterator(迭代)和ListIterator的区别

24.什么是面向对象,什么是类,什么是对象

25.什么是构造器?有什么作用?

26.重载和重写的区别

27.访问控制修饰符

28.final、finally、finalize 有什么区别?

29.== 和equals的区别

30.Object类中常用的方法

31.接口和抽象类有什么区别

32.super和this的区别

33.静态方法和实例方法的区别

34.什么是序列化,有什么作用

35.怎么样实现序列化

36.流是什么,常用的流有哪一些,file中的常用方法

37.file的常用方法:

37.线程的生命周期

 38.线程的创建方式

39.什么是同步,异步

40.同步的实现方式

41.Lock锁和synchronized的区别

42.什么是死锁,怎样避免死锁

43.wait和sleep的区别

44.为什么要用异常,异常的介绍,throw和throws的区别

45.线程和进程的区别?

46.notify()和 notifyAll()有什么区别?

47.线程的 run() 和 start() 有什么区别?

48.synchronized 和 volatile 的区别是什么?

49.什么是反射?

50. 通过反射怎么获取类的实例

51.冒泡排序

52.设计模式:单例,工厂模式,代理模式,模板模式

二、数据库部分

11.有哪些锁                          

12 怎样避免死锁

12.索引分类

普通索引: 最基本的索引,没有任何限制

13.mysql的引擎(8个,下面介绍三个)

三、jdbc部分

四、web部分

   五、spring部分

简单的参数传递

对象的方式传递

RestFul风格

 六、Springboot部分

七、Mybaits的知识

八、Nginx的面试题

八、Springcloud部分

Redis 是什么?都有哪些使用场景?

Redis 有哪些功能?

Redis 和 memcache 有什么区别?

Redis 为什么是单线程的?

什么是缓存穿透?怎么解决?

Redis 支持的数据类型有哪些?

Redis 支持的 Java 客户端都有哪些?

jedis 和 Redisson 有哪些区别?

怎么保证缓存和数据库数据的一致性?

Redis 持久化有几种方式?

Redis 怎么实现分布式锁?

Redis 分布式锁有什么缺陷?

Redis 如何做内存优化?

Redis 淘汰策略有哪些?

Redis 常见的性能问题有哪些?该如何解决?


                

一、java基础

1.基本数据类型

整数类型:short byte(-128~127) int long

浮点类型:float,double

布尔类型:boolean

字符类型:char(0-65535)

2.jdk,jre,jvm,之间的关系

JDK

JDK,全称Java Development Kit,是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心。

JRE

JRE,全称Java Runtime Environment,是指Java的运行环境,是可以在其上运行、测试和传输应用程序的Java平台

JVM

JVM,全称Java Virtual Machine(Java虚拟机),是一种用于计算设备的规范,它是一个虚构出来的计算机,引入JVM后,Java语言在不同平台上运行时不需要重新编译。JVM是Java跨平台的核心

 

c52eb27c946742f48b2da65e9514e67f.png

 

3.jvm的调优

 

Jvm优化: 

(1)代码层面

(2)可以分带收集算法,按新生代和老年代进行垃圾回收,

(3)运用垃圾回收器回收

JMM调优主要就是调整下面两个指标

停顿时间:垃圾收集器做垃圾回收中断应用执行的时间。-XX:MaxGCPauseMiIlis

吞吐量:垃圾收集的时闻和总时间的占比: 1(1+n1.吞吐量为1-18[1#n)。-XXLGCTimeRatlo

 

Jvm调优的步骤:

1打印GC日志

-XX:+PrintccDetai1s -xX:+PrintGCTimestamps -xX:+PrintccDateStamps -xloggc:./gc.1og

2 分析日志得到关键性指标

3 分析gc原因 调优jvm参数

 

4.gc的算法

  1. 标记-清理

           未标记的对象,直接清理释放内存

             速度较快

           产生碎片,效率降低

  1. 标记-整理

          效率不高

没有碎片

  1. 标记-复制

           效率高

             占用两倍内存空间

5.类中元素储存位置

:存放的new出来的对象

: 存放的是方法中的局部变量和引用变量

方法区:放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量

本地方法栈:保存native方法进入区域的地址。

寄存器:每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。保存下一条将要执行的指令地址的寄存器是 :PC寄存器。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应

6. do-while while的区别

while 先判断再循环,有可能一次都不执行,do-while 先执行再判断最少执行

7.常用的循环有哪一些

while do-while for

8.break,continue,return的区别

break 是结束整个循环,continue结束当前循环,继续下一次循环,return 结束整个方法

9、switch() case中的表达式能是什么类型的

  byte short int char Strin

10.什么是递归:

  方法自己调用自己

11.String类的常用方法

 charAt(),获取字符串的莫一个字符       toUpperCase()把字符串转大写 toLowerCase()字符串转小写,equals:比较两个字符串是否相等,split切分字符串

12.String为什么是不可变对象

String类有一个char []value 数组的属性 前面加了final关键字,字符串本身就是由字符数组组成所以说String是不可变对象

13. String为什么是final修饰的:

java中所有自己定义的类都是final的,是为了防止程序员修改源代码,保证代码的安全性,因为fianl修饰的类不能继承

14. String和StringBulider的区别

  String修饰的对象是不能改变的对象,StringBuilder修饰的对象的是可变对象,在对字符串经常修改的情况用StringBuilder

15. StringBulider和StringBuffer,ArrayList和Vector,HashMap和Hashtable的区别

StringBuilder是非线程安全的,效率高,StringBuffer是线程安全的效率低

ArrayList:是线程非安全的,效率高,Vector是线程安全的效率低,ArrayList:每次扩容为之前的1.5倍,Vector每次扩容为之前的2倍

HashMap:是非线程安全的,效率高,key和value可以为空,HashMap实现了Map接口,,HashMap默认的容量大小是16;每次扩容“原始容量的两倍”。

Hashtable是线程安全的效率低,key和value不可以为空,Hashtable继承了Dictionary 类,Hashtable默认的容量是11;增加容量时,每次将容量变为“原始容量2倍 + 1

16.数组和集合的特点

  数组的类型是一样的,长度不能改变,集合是可以自动扩容

17.数组和集合的转化

 

数组转集合

String [] arr={"a","b"};

Arrays.asList(arr);//数组转换为集合

ArrayList <Integer> arr1=new

ArrayList<Integer>();

arr1.toArray()//集合转数组

18. ArrayList和linkedList的底层实现和区别

 ArrayList的底层是数组,是线性表,查询快,删除,添加数据慢,因为需要移动数据,默认容量10,每次扩容1.5倍,元素有序可以重复

linkedList的底层是链表,删除添加数据快,添加和删除数据的时候只需要移动指针就行,查询慢

 19.HashMap的底层

HashMap的底层:底层是数组加链表,以key和value形式存在,key不能重复,value可以重复,默认容量16,加载因子是0.75,怎么存放数据,是先对key进行hash算法,得到一个值,这个值还要和集合的长度取余,的到一个0-15的一个值,这个值就就是数组的下标,先判断这个下标对应的数组的内容是否有值如果没有值就直接把数据放进去,如果有值就对key进行equals比较,如果equals为true就直接覆盖,如果不相等就以链表的方式链在后面,当链表中的数据为8的时候形成红黑树,链表的长度为6的时候又会恢复链表

20.List和set的区别

  List:数据可以重复有序,set数据不能重复无序

21.怎么把集合变成线程安全的

  可以用Vector换ArrayList,可用用HahMap换成Hashtable,还可以加锁,用集合中的方法可以

实现。 Collections.synchronizedList() Collections.synchronizedMap()

22.Collections和Collection的区别,

Collections是一个工具类,Collection是一个接口

23.Iterator(迭代)和ListIterator的区别

1.Iterator在使用过程中,不能对集合元素进行添加操作,否则会抛出异常。

2.使用范围不同;Iterator可以在所有集合中使用,而ListIterator只能在List类型与子类型

3.listIterator有add方法,可以向集合中添加元素,而iterator不能。

4.listiterator和iterator都有hasnext和next方法可以顺序遍历元素, 但是listiterator有hasprevious和previous方法,可以逆向遍历元素

5.listiterator可以定位当前的索引位置 nextIndex和previousIndex可以实现,iterator没有此功能

6.listiterator可以实现对对象的修改set()方法可以实现,iterator仅可以遍历,不能修改。

24.什么是面向对象,什么是类,什么是对象

     是设计思想,把我们的思想用java代码描述出来

     什么是类:同类事件具有相同特点和行为的集合

      对象:具有各自行为和特点的个体

25.什么是构造器?有什么作用?

产生对象的,方法名和类名一样,没有返回值

26.重载和重写的区别

重载:在同一个类中,方法名一样,参数列表不一样

重写:  在自父类中,方法名一样,参数列表一样,返回类型一样,修饰符大于等于父类型,异常小于等于父类型抛出的异常

27.访问控制修饰符

  private :只在本类中可以见

default :本类和同包类可见,

protected :本类,同包类,不同包的子类可见

public: 所有的类可见

28.final、finally、finalize 有什么区别?

Final:表示最终的,可以修饰方法,可类,属性

修饰的类不能被继承,修饰的方法不能重写,修饰的变量的值不可以改变

finally:是异常里面的关键字,它里面的代码不管有么有异常都要执行

finalize: 是 Object 类的一个方法,在垃圾收集器执行的时候会调用的次方法

29.== 和equals的区别

 ==比的是地址,equals比的是内容,在自定义内中equals默认是按==比较,需要按内容比较需要重新equals方法自己定义比较规则

30.Object类中常用的方法

   equals() hashCode() finalize() wait() clone() toString()notify();notifyAll();

31.接口和抽象类有什么区别

  接口的关键字是interface,接口中的方法都是抽象方法,接口中的变量都是常量,接口是用来实现的,一个类可以实现多个接口,接口可以继承多个接口

 抽象类的关键字是abstract,,抽象类可以有具体的方法和抽象方法,有抽象方法的类一定是抽象类,抽象类中不一定有抽象方法,抽象类中可以有构造器,抽象类是用来继承的一个类只能继承一个抽象类

32.super和this的区别

   super表示父类

   This表示当前类

33.静态方法和实例方法的区

 静态方法前面加了static,静态方法只能调用静态方法,不能直接调用实例方法,实例方法可以直接调用静态方法和实例方法

34.什么是序列化,有什么作用

 序列化就是将对象流化,转换为二进制,作用就是方便在网络上传输和存储数据

35.怎么样实现序列化

 对象实现一个Serializable 接口,然后添加一个serialVersionUID号,通过对象流实现对象的序列化和反序列化,序列化就是讲对象流化为二进制,反序列化就是将流化的二进制转为对象

36.流是什么,常用的流有哪一些,file中的常用方法

 是相当于管道,管道里面流的数据就是流,常用的流有哪一些,字节流和字符流(普通的字符流,缓存流),

37.file的常用方法

isDirectory() 是否为文件夹

isFile() 是否为文件

getPath() 得到file的路径

getName() 得到最后一层的名字

getParent() 得到去掉最后一层的路径

getParentFile() 得到父类路径的新文件

renameTo() 改名

mkdir() 创建新文件夹,只能创建一层

mkdirs() 创建新文件夹,可以多层

createNewFile() 创建新文件,只能一层

exists() 路径是否存在

delete() 删除文件或者目录(为空的目录)

list() 返回该路径下文件或者文件夹的名字数组

listFiles() 返回该路径下文件或者文件夹组成的File数组

37.线程的生命周期

 生命周期:创建,可运行,运行,堵塞,死亡

c04fddfbfb4b444998750c4e9f38ae42.png

 38.线程的创建方式

 线程的创建方式:继承Thread类,实现Runable接口,线程池,实现Callable接口

39.什么是同步,异步

线程的同步:需要排队线程的异步:  不需要排队

40.同步的实现方式

同步的实现方式:加(synchronized)锁,锁可以加到方法上面和代码块上面 ,lock锁

 

41.Lock锁和synchronized的区别

1.首先synchronized是java内置关键字,Lock是个java接口;

2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;

3.synchronized会自动释放锁Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;

4.Lock锁适合大量同步的代码的同步问题,不能修饰方法,synchronized锁适合代码少量的同步问题。可以修饰方法

42.什么是死锁,怎样避免死锁

什么是死锁:两个或两个以上的线程或进程在执行过程中,因互相争夺资

源而造成的一种互相等待的现象,若无外力作用将一直持续下去,

这种现象称为死锁。

怎么避免死锁:加锁顺序(线程按照一定的顺序加锁)

加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

死锁检测

43.wait和sleep的区别

wait可以指定时间也可以不指定。

sleep必须指定时间。

wait是Object类的方法,sleep是Thread的方法

wait:释放锁,sleep:不释放锁。

sleep会自动唤醒,wait需要notify() 或者notify all() 唤醒

44.为什么要用异常,异常的介绍,throw和throws的区别

 

   为什么要使用异常:如果有运行异常而不处理异常程序不会往下运行,会打断程序

   异常的处理:有throws和try-catch两种处理方式

   异常的分类: 异常有运行时异常和非运行时异常。

   运行时异常有:常见的运行时异常

IllegalArgumentException:非法参数异常

NullPointerException :空指针异常

ArrayIndexOutOfBoundsException :数组越界异常

ClassCastException: 类型转换异常

NumberFormatException :数字格式转换异常

非运行时异常:常见的是IO异常我SQL异常,必须要处理不然会报错

Throw和Throws的区别:throw抛出一个异常,throws可以抛出多个异常  throw一般和throws或者try-catch一起使用

45.线程和进程的区别?

      进程就是一个程序比如在电脑里面登陆qq,qq就是一个进程,登陆qq后可以聊天可以发qq邮件,可以玩qq游戏,这个就可以认为是线程,一个进程里面可以有多个线程

46.notify()和 notifyAll()有什么区别?

Notify 唤醒的是一个线程,notifyAll可以唤醒多个线程

47.线程的 run() 和 start() 有什么区别?

start()是启动线程让线程处于可运行状态,run()方法用于执行线程的运行时代码

48.synchronized 和 volatile 的区别是什么?

1volatile 是变量修饰符;synchronized 是修饰方法、代码段

2volatile 仅能实现变量的修改可见性可以防止指令重排,不能保证原子性,synchronized 则可以保证变量的修改可见性和原子性。

3而volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。

49.什么是反射?

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

50. 通过反射怎么获取类的实例

1 Class.forName(“包名.类名”);

2类名.class

3对象.getClass();

51.冒泡排序

  冒泡排序(重点),选择排序,插入排序,快速排序

  冒泡排序:相邻的两个数比较每一次找出一个最大或者是最小的数

for(int i=0;i<arr.length-1;i++){

 for(int j=0;j<arr.length-1-i;j++){

   if(arr[j]>arr[j+1]){//相邻的两个数进行比较

   int temp=arr[j]; //交换

arr[j]=arr[j+1];

arr[j+1]=temp;

}

}

}

52.设计模式:单例,工厂模式,代理模式,模板模式

单例模式:只会产生一个对象,饿汉模式和懒汉模式

饿汉模式:static SingleDemo singleDemo=new SingleDemo();//饿汉模式

工场模式:工厂模式是为了解耦:把对象的创建和使用的过程分开,用户不需要知道对象怎么产生的细节,只需要获取对象就可以了

代理模式:一个类代表另一个类的功能,为其他对象提供一种代理以控制对这个对象的访问。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

何时使用:想在访问一个类时做一些控制。

应用实例: 1、Windows 里面的快捷方式。  

二、数据库部分

1.什么是ddl,dml语句 他们有什么特点,数据库中的内连接和外连接,以及左外和右  外连接的区别

ddl语句:数据库定义语言,事务自动提交,

有create,drop,alter,truncate 语句

dml语句:数据库操作语言,事务需要手动提交,

有 update,delete,insert

内连接:两个表全部匹配的上的数据才会在结果集中出现

外连接:分左外连接和右外连接,

左外连接:左边表的数据全部出现在结果集中右边匹配不上的显示null

右外连接:右边表的数据全部出现在结果集中左边匹配不上的显示null

2 什么是事物,他的特点有哪一些

 什么是事务: 事务是保证数据的完整性要不一起成功要不一起失败,事务也就是会话中的一系列ddl和dml语句的操作(连接上数据库的用户就是一个会话)

事务的特点:原子性,一致性,持久行,隔离性

事务的隔离级别:read-uncommitted,(读未提交)

read-committed(读已提交)(oracle的默认隔离级别)

repeatable-read(重复读)(mysql的默认隔离级别)

set tx_isolation='serializable';串行化

3.怎么提高数据库的性能

  (1)为数据库中的表添加适当的索引,表创建合适的主外键(经常查询的字段建索引)

  (2) 优化SQL语句(查询的时候不要用select *,查询的时候写字段名字,尽量不要用多表连接查询,用模糊查询的时候%不要在前面)

  (3)添加数据库缓存/redis缓存服务器

  (4).定期进行数据库文件转储分为当前表和历史表

  (5)使用数据库分库分表,读写分离(shadingjdbc,mycat)

4.什么是索引,什么是视图,他们有什么特点,优点和缺点

   索引:索引的底层是B+Tree的结构,索引相当于书的目录。

优缺点:方便查询,但是也不是建的越多越好,索引需要占内存,在进行dml语句操作的时候需要维护索引,一定程度上对dml语句的操作有一定的阻碍作用

视图:一条查询语句,一张虚拟的表,不占内存

优缺点:方便查询,不占内存,对数据访问有一定的限制,可以确保数据的安全性,会产生脏数据在进行插入和添加的时候这种有条件的试图,通过视图插入的数据在视图中看不到,通过视图更新的数据在试图中也看不到,但对删除没有影响

创建视图的语法:

create  or replace view emp_view as

 select empno,sal,deptno from emp where deptno=10;

5.索引在什么情况下失效

(1). 没有 WHERE 子句

(2). 使用  IS NOT NULL

(3). 使用 LIKE ‘%T’ 进行模糊查询

(4). 在索引列上使用函数

(5).  字符型字段为数字时在where条件里不添加引号

(6). 某个表中,有两列(id和c_id)都建了联合索引,下面这种查询条件不会走索引(select * from test where c_id=1 and id=2)

6  索引是底层是B+Tree的实现

一个m阶的B+树具有如下几个特征:

1非叶子节点只存储键值信息。

2所有叶子节点之间都有一个链指针。

3数据记录都存放在叶子节点中

7.为什么要使用B+tree

1. B+树是多路平衡查找树(B-Tree)的变种(Plus版本),多路绝对平衡查找树,他拥有B-树的优势

2. B+树的扫库扫表能力更强。

3. B+树的磁盘读写能力更强。

4. B+树的排序能力更强。

5. B+树的查询效率更加稳

8.数据库的主从复制(redis里面有讲认真听)

548fd825f8e845488cb6ad59c22a5634.png

 9.数据库的三范式

第一范式:表中要有主键,字段不能分

第二范式:满足第一范式的条件下,表中建立外键(非主键属性,完全依赖于主键属性)

第三范式:满足第一,二范式的条件下,非主键属性无传递依赖

(A依耐B ,B依耐C 就可以说A依耐C)

 

 

 

10.关系型数据库和非关系型数据库区别

  关系型数据库:

  优点

(1)容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;

(2)使用方便:通用的SQL语言使得操作关系型数据库非常方便;

(3)易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;

(4)支持SQL,可用于复杂的查询。

(5)支持事务

  缺点

(1)、为了维护一致性所付出的巨大代价就是其读写性能比较差;

(2)、固定的表结构;

(3)、不支持高并发读写需求;

(4)、不支持海量数据的高效率读写

非关系型数据库

(1)使用键值对存储数据;

 优点

支持分布式,无需经过sql层的解析,读写性能很高 基于键值对,数据没有耦合性,容易扩展 存储数据的格式:nosql的存储格式是key,value形式

 缺点 不提供sql支持

11.有哪些锁                          

概念

乐观锁(上了锁没有释放,其他人照样可以操作表)

自己实现,通过版本号

悲观锁(一断上了锁,没有释放锁,不允许其他人对表进行操作)

加 lock

加写锁:

lock   tables   table_name   read;//其他事务只能读,不能加写锁,要等待更新。

加读锁:

lock   tables   table_name write;//其他事务不能读

解锁:

unlock  tables;

 

排它锁

一个事务,只能写,for update

行锁

作用于数据行

表锁

作于用表

12 怎样避免死锁

(1)使用事务,不使用 lock tables 。

(2)保证没有长事务。

(3)操作完之后立即提交事务,特别是在交互式命令行中。

(4)如果在用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE),尝试降低隔离级别。

(5) 修改多个表或者多个行的时候,将修改的顺序保持一致。

(6)创建索引,可以使创建的锁更少。

(7)最好不要用 (SELECT ... FOR UPDATE or SELECT ... LOCK IN SHARE MODE)。

(8)如果上述都无法解决问题,那么尝试使用 lock tables t1, t2, t3 锁多张表

12.索引分类

普通索引: 最基本的索引,没有任何限制

唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。

主键索引: 它是一种特殊的唯一索引,不允许有空值。

全文索引: 针对较大的数据,生成全文索引很耗时好空间。

组合索引: 为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则

13.mysql的引擎(8个,下面介绍三个)

show engines; // 查看mysql所支持的存储引擎,以及从中得到mysql默认的存储引擎。

  show variables like '%storage_engine'; // 查看mysql 默认的存储引擎

 Mylsam(不支持事务,外键),

innodb(支持事务,外键),

memory(数据存储于Mysql内存中,mysql重启数据全部丢失.),MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM)

14. mysql和oracle的区别

最重要的区别 

MySQL是轻量型数据库,并且免费,没有服务恢复数据。

Oracle是重量型数据库,收费,Oracle公司对Oracle数据库

有任何服务。

(2) 对事务的提交

       Mysql默认是自动提交,而oracle的事务需要手动提交

(3) 事务隔离级别

      mysql的默认隔离级别repeatable read,oracle的事务隔离级别read-committed

(4)自动增长的数据类型处理

        mysql有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

   (5)  oracle中id的自动增长需要自己创建

 create sequence sequence_name

    increment by 1

start with 1

insert into 表名(id,name) values(sequence_name.nextval,'张三');

  (6)分页的sql语句处理

 mysql用的是limit,oralce用的是rownum

15.存储过程

存储过程就相当于java中的方法,里面封装的是一系列sql语句,可以重复的调用,可以没有返回值类型

存储过程是为了完成功能可以没有返回值

创建存储过程:

delimiter //

drop procedure if exists 存储过程名//

create procedure 存储过程名()

begin

  sql语句;

  sql语句;

  sql语句;

end//

  调用存储过程

call 存储过程名(值,值...);

例子:

查询dept表的记录

delimiter //

drop procedure if exists pro_dept //

create procedure pro_dept()

begin

  select * from dept;

end//

delimiter ;

call pro_dept();  //掉用存储过程

16.触发器

触发器是一个特殊的存储过程,不需要参数,不要调用,系统自动触发

例子

delimiter //

drop trigger  tongji_trig//

create trigger tongji_trig

after insert

on test

for each row

begin

  update tongji set count=count+1;

end//

这个例子的作用在给test表插入数据的时候,数据库自动的把tongji表的count字段+1,这个count的值的增加不需要我们手动操作,数据库会自动的做,这个就是触发器的作用

三、jdbc部分

1.jdbc连接数据库的步骤

(1)加载驱动

(2)获取连接

(3)获取statement对象

(4)执行sql获取结果集

(5)关闭连接

2.jdbc 中statement 和prepstatement的区别

prepstatement可以防止sql注入,可以预编译,效率高,代码的可读性和可维护性

四、web部分

1.http和https的区别,

1、HTTPS  协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)

2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者http是80,https后者是443。

HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

2.TCP和UDP协议的区别

 TCP/IP协议族的传输层协议主要包含TCP和UDP

1 tcp是面向连接的可靠的传输层协议,udp是无连接的传输协议

2 安全方面的区别: tcp的安全性没有udp的安全性高,并且udp的漏洞比较少,不容易被一些不法分子利用。

3 传播速度的区别: udp的传送速度也比tcp的快。因为tcp在传送的时候要先建立连接,建立连接的时候是比较耗时的,而且在传送数据的时候还要确认一些东西,而udp无连接传送数据的。

4 连接对象数量的区别: tcp是一对一的连接,而udp是一对多个或多对多个连接的。

3.TCP协议:

       位于传输层, 提供可靠的字节流服务。所谓的字节流服务(Byte Stream Service) 是指, 为了方便传输, 将大块数据分割成以报文段(segment) 为单位的数据包进行管理。 而可靠的传输服务是指, 能够把数据准确可靠地传给对方。 即TCP 协议为了更容易传送大数据才把数据分割, 而且 TCP 协议能够确认数据最终是否送达到对方。所以,TCP连接相当于两根管道(一个用于服务器到客户端,一个用于客户端到服务器),管道里面数据传输是通过字节码传输,传输是有序的,每个字节都是一个一个来传输。

4.三次握手:

握手过程中使用了 TCP 的标志(flag) —— SYN

(synchronize)标识 和ACK(acknowledgement) 确认。

第一次握手:建立连接时,客户端A发送SYN包(SYN=j)里面有SYN和唯一序列号到服务器B,并进入SYN_SEND状态,等待服务器B确认。

第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,完成三次握手。

5.四次挥手

四次挥手:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。先进行关闭的一方将执行主动关闭,而另一方被动关闭。

客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。

服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

客户端A发回ACK报文确认,并将确认序号设置为收到序号加1

6.Ajax的同步和异步的区别

同步:

同步的思想是:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉。

同步就相当于是 当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。用户使用起来会有不友好。

异步:异步就是,当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。

6.ajax的 请求类型:post,get

post:提交的数据不会在浏览器上显示,相对安全,提交的数据量相对大一些,一般被默认为不受限制

get:提交的数据会在浏览器上显示,不安全,提交的数据量少

7.ajax的提交数据的格式:

text,html,script,xml,json

8.axios五种请求类型

1get一般多用于获取数据

2post: 主要提交表单数据和上传文件

3put对数据全部进行更新

4patch只对更改过的数据进行更新

5delete删除请求(参数可以放在url上也可以和post一样放在请求体中)

9.VUE生命周期(难点!!)

周期:

1.初始化周期

1.beforeCreate vue对象实例化之前(刚开始)

2. created

3. beforeMount

4. Mounted 说明VUE对象实例化成功(DIV渲染完成)

2.修改周期

1. beforeUpdate 用户修改数据之前

2. updated 用户修改数据之后

3.销毁周期

1. beforeDestroy VUE对象销毁前

2. destroyed VUE对象销毁后(最后一步)

10.MVVM设计思想

知识回顾: MVC模式 核心思想 减少代码的耦合性

M Model:封装的数据

V View 视图层: 数据的展现

C Contro 控制层 程序的流转的过程

衍生: 3层代码的结构 Controller—Service–Mapper/Dao

针对于: 后端服务器.

MVVM思想说明:

M: Model 封装的数据. 数据层

V: View 数据的展现 视图层

VM: viewModel视图数据的控制层 控制数据流转

MVVM设计思想是前端模拟后端为了解耦的一种设计思想.

11.什么是json,json怎么转对象,对象怎么转json

**JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。**它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成

12.简述什么是跨域

1. 如果浏览器的网址与Ajax请求网址必须满足同源策略.则浏览器才能解析Ajax,执行正确的请求.

2. 同源策略规定

   规定要求:请求协议://域名:端口号

1.如果3者都满足,则符合同源策略.浏览器可以正确解析.

2.反之(有一个不满足)不满足同源策略.称之为跨域请求 则浏览器不能正常解析Ajax请求.

3.跨域解决方案:

1.JSONP(以前使用)

2.CORS(跨域资源共享)

 同源策略

要素1: 浏览器地址: file:///D:/workspace/cgb2105/webDemo/userList.html 展现页面

要素2: Ajax请求地址: http://localhost:8090/getAll

要求: 如果浏览器的地址与Ajax请求地址如果满足 HTTP请求协议/请求的域名/端口号 要求3项必须相同则满足同源策略. 浏览器可以解析返回值,则请求正确.

3.2 同源策略题目

例子1:

1. 浏览器地址: http://localhost:8090/a.html

2. Ajax地址: http://localhost:8091/getAll 不满足:端口号不一样

例子2:

1. 浏览器地址: http://localhost:8090/a.html

2. Ajax地址: http://www.baidu.com:80/getAll 不满足: 域名/端口号不一样

例子3: 前提: IP与域名正确映射 DNS

1. 浏览器地址: http://10.1.10.8/a.html

2. Ajax地址: http://www.baidu.com/getAll 不满足:域名不一致

 跨域解决策略

 JSONP

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的

核心知识: 利用 <script src属性=“获取远程服务器数据”> 实现跨域访问.

 CORS 跨域资源共享

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)

跨域资源共享( CORS ) 是一种基于HTTP 标头的机制,它允许服务器指示浏览器应允许从其加载资源的任何其他来源(域、方案或端口)。CORS 还依赖于浏览器向托管跨域资源的服务器发出“预检”请求的机制,以检查服务器是否允许实际请求。在该预检中,浏览器发送指示 HTTP 方法的标头和将在实际请求中使用的标头

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

   五、spring部分

1.spring mvc的流程

(1)用户发送请求至前端控制器DispatcherServlet。

(2)DispatcherServlet收到请求调用HandlerMapping处理器映射器。

(3)、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

(4)、DispatcherServlet调用HandlerAdapter处理器适配器。

(5)、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

(6)、Controller执行完成返回ModelAndView。

(7)andlerAdapter将controller执行结果ModelAndView返回给 DispatcherServlet。

2.spring的核心

  两大核心IOC,AOP

IOC 控制反转:就是指将对象的创建,对象的存储(map),对象的管理(依赖查找,依赖注入)交给了spring容器。

依赖注入(DI)更加准确地描述了IoC的设计理念。所谓依赖注入,即类之间的依赖关系由spring容器运行期来决定,对象创建好后,属性的赋值的过程叫依耐注入

依耐注入的方式:,

  1. 构造器注入,
  2. p空间注入,
  3. 注解注入(如:@Autowired,@Component)
  4.  setter 注入
    aop:面向切面编程

是一个面向切面编程的思想,补充了OOP的不足.

在不改变原有业务功能的情况下,添加新的功能.

让程序员更专注业务代码本身

aop经典的使用场景

 统计性能分析 / 权限管理 / 事务管理 / 日志 / 缓存…

aop的基本概念

连接点:类中所用的方法

切入点缺失共性功能代码的方法

通知:抽取的共性代码组成的方法,通知有位置区分,是从切入点方法前面还是后面抽取的代码,叫通知类型

引入(只能抽取逻辑代码,变量是拿不出来的,把变量引入到切入点方法中去就要用到引入)

 目标对象有切入点方法的对象

 代理对象spring代理目标对象叫aop代理

 织入:代理对象把通知织入到目标对象的切入点方法中

 切面:通知和切入点的关系

通知类型:

@Before : 表示是一个前置通知

@After : 表示是一个后置通知

@Around : 表示是一个环绕通知

@AfterThrowing :表示一个异常通知

@after-returning:返回后通知

  1. aop的底层实现

是由动态代理实现,动态代理分jdk动态代理和cglb动态代理

3.bean对象的作用域,bean是线程安全的吗

(1)singleton作用域(单例) ,当一个bean的作用域设置为singleton, 那么.Spring IOC容器中只会产生一个实例

(2)prototype(多例), 当一个bean的作用域设置为prototype, 那么.Spring IOC容器每次都会产生一个新对象

(3).request 作用域,

(4)session作用域,

Bean不是线程安全的

4.factorybean和beanfactoy的区别

  1. beanFactory是IOC最基本的容器,负责生产和管理bean,

它为其他具体的IOC容器提供了最基本的规范,BeanFactory是个Factory,也就是IOC容器或对象工厂。

beanFactory的源码

 

(2)FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。    

5.spring中常用的注解

 (1)普通注解

  @RestController(控制器层),

@Service(业务层)

@Component(通用注解) ,

@Autowired(注入对象)

@RequestMapping

@ResponseBody

切面(AOP)相关注解

@Aspect 声明一个切面(类上)

@After 在方法执行之后执行(方法上)

@Before 在方法执行之前执行(方法上)

@Around 在方法执行之前与之后执行(方法上)

@PointCut 声明切点

6.什么是循环依耐,是怎么解决循环依耐的

什么是循环依赖?Spring是怎么解决循环依赖的? - 未知的九月 - 博客园

简单来说,A对象有一个属性是B,B对象有一个属性是A,当A对象生成的时候依赖B对象,B对象生成的时候需要依赖A对象,这个时候就很容易形成一个闭环,如果这样一直死循环下去。

Spring内部通过三级缓存来解决循环依赖的问题。核心类:DefaultSingletonBeanRegistry

所谓三级缓存,就是spring容器解决循环依赖的三个map:

一级缓存:singletonObjects,是一个ConcurrentHashMap,也叫单例池,存放已经经历了完整生命周期的Bean对象,里面存放的是一个已经初始化的对象

二级缓存:earlySingletonObjects,是一个HashMap,存放早期暴露出来的Bean对象,Bean的生命周期未结束,属性还未填充完整,里面存放的是一个实例化对象,只是在内存里面分配了空间没有给属性赋值的对象

三级缓存:singletonFactories,里面存放的所以个lambda表达式,里面可以获取代理对象,如果用到aop就需要使用三级缓存

只有单例的Bean会通过三级缓存来解决循环依赖的问题,而非单例的Bean,每次从容器获取都是一个新的对象,都会重新创建,所以非单例的Bean是没有缓存的,不会放在三级缓存中。

7.Spring创建Bean对象主要分为两个步骤:

(1)创建原始Bean对象

(2)填充对象属性和初始化

每次创建Bean的之前,都会从缓存中查下有没有bean,因为是单例,只能有一个;当我们创建完成BeanA 的原始对象后,并把他放到二级缓存中,这时候发现依赖BeanB,接着去创建Bean B , 同样的流程填充时发现依赖Bean A又是同样的流程。不同的是,这个时候可以在一级缓存中查到刚放进去的原始对象beanA, 所以不需要继续创建,用它来注入Bean  B , 完成B的创建。 既然B创建好了,所以A就可以继续完成填充属性的步骤了,闭环完成。

8.三级缓存解决循环依耐问题的关键是什么?

实例化和初始化分开操作,在中间过程中给其对象赋值的时候,并不是一个完整的对象,而是把半成品对象赋值给了其他对象,Spring通过将实例化后的对象提前暴露给Spring容器中的singletonFactories,解决了循环依赖的问题。

面试官:

spring循环依赖是怎么解决的?

回答:循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleA,则它们最终反映为一个环。

Spring如何解决循环依赖?

假设场景如下,A->B->A

1、实例化A,并将未注入属性的A暴露出去,即提前曝光给容器Wrap

2、开始为A注入属性,发现需要B,调用getBean(B)

3、实例化B,并注入属性,发现需要A的时候,从单例缓存中查找,没找到时继而从Wrap中查找,从而完成属性的注入

4、递归完毕之后回到A的实例化过程,A将B注入成功,并注入A的其他属性值,自此即完成了循环依赖的注入

spring中的循环依赖会有3种情况:

1.构造器循环依赖

    构造器的循环依赖是不可以解决的,spring容器将每一个正在创建的bean标识符放在一个当前创建bean池中,在创建的过程一直在里面,如果在创建的过程中发现已经存在这个池里面了,这时就会抛出异常表示循环依赖了。

2.setter循环依赖

   对于setter的循环依赖是通过spring容器提前暴露刚完成构造器注入,但并未完成其他步骤(如setter注入)的bean来完成的,而且只能决定单例作用域的bean循环依赖,通过提前暴露一个单例工厂方法,从而使其他的bean能引用到该bean.当你依赖到了该Bean而单例缓存里面有没有该Bean的时候就会调用该工厂方法生产Bean,

Spring是先将Bean对象实例化之后再设置对象属性的

Spring先是用构造实例化Bean对象,此时Spring会将这个实例化结束的对象放到一个Map中,并且Spring提供了获取这个未设置属性的实例化对象引用的方法。

为什么不把Bean暴露出去,而是暴露个Factory呢?因为有些Bean是需要被代理的

3.prototype范围的依赖

对于“prototype”作用域bean,Spring容器无法完成依赖注入,因为“prototype”作用域的bean,Spring容器不进行缓存,因此无法提前暴露一个创建中的Bean。

9.ioc的核心

     依耐注入,

10.什么是bean容器

     管理bean的工产

11.重定向和转化的区别

     重定向:发送的是两次请求,不会共享同一个request,地址会发生改变,可以重定向任何地址

     转发:发送的是一次请求,会共享同一个request,地址不会发生改变,能转化到同一个工程里面

12.cookie和session的区别

     Cookie的数据是保存到浏览器的,不安全,保存的数据大小有限,不能保存中文

Session的数据是保存到服务器的,安全,保存的数据大,可以保存中文,

13.mave 命令

clean 清空项目编译之后的文件class(位于target目录中)

install 将项目中的target中的class进行打包 xxx.jar包

时会将测试类一同打包.所以需要注意代码正确性.

14.spring 中bean的生命周期

  实例化(只是在堆中开辟了空间没有给属性赋值)->初始化(给属性赋完了值)->销毁(服务器关闭的时候)

  1. 实例化 Instantiation
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 销毁 Destruction

15.SpringMVC 参数传递方式

简单的参数传递

url地址: http://localhost:8090/getUserById?id=100

对象的方式传递

URL: http://localhost:8090/getUser?id=100&name=“tomcat”&age=18

RestFul风格

http://localhost:8090/user/100

16.重定向和转发

1 重定向请求的地方会改变

2  发送的是两次请求不能共享request

3 重定向的地址是任意的

转化:

   转化的地方不会改变,发送的是一次请求,地址只能在同 一个应用里面

转发问题

说明:用户访问服务器,但是目标服务器无法处理该请求,由服务器内部将请求交给其他服务器处理. 这个过程称之为转发.

 重定向问题

说明: 用户访问服务器,但是目标服务器无法处理该请求,目标服务器返回一个能够处理请求的网址.由用户再次发起请求,访问服务器获取数据.

17.cookie和session的区别

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。

总结:Session

1. 安全,保存到服务器,可以保存中文

2. 保存的数据量大

3.session的默认保存时间是30分钟

Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 [1] 。

总结: Cookie

1. 不安全,保存到浏览器

2. Cookie 保存的数据大概在2kb

3. Cookie中不能保存中文

18.路由导航守卫

需求: 如果用户没有登录,则不允许访问其他的页面,只允许访问login登录页面.

实现:

1. 前端实现: VUE中提供了路由导航守卫!!!

2. 单点登录策略

19.Springboot核心配置文件是什么?有哪两种类型,他们有什么区别

核心配置文件的类型有:yml,yaml和properties

 正常的情况是先加载yml,接下来加载properties文件。如果相同的配置存在于两个文件中。最后会使用properties中的配置。最后读取的优先集最高。yml文件的内容key=value的形式,properties的内容有严格的格式

20.动态代理是什么,有什么作用

 

 

 

 21.linux 常用的命令

  • ls 查看目录的文件,pwd::查看当前目录,cd:切换目录,rm: 删除目录

 六、Springboot部分

1.springboot的注解

(1)@SpringBootApplication 启动注解

(2)@MapperScan 开启mapper的包扫描

(3)@SpringBootTest 测试注解

2.springboot的优缺点

   优点(简化编码,简化配置,简化部署,简化监控,简化依赖导入,简化整合其他技术)

1  配置简单

2,每个模块可以独立运行

3,测试简单,没有xml配置

4,容易学习,提升开发效率

5,内嵌了tomcat服务器

6,避免大量的maven导入和各种版本冲突

  缺点

1所有的配置信息都在配置文件中,并且配置文件的格式要求很严格,写错了没有任何的错误提示,不易修改错误

2依赖太多,依耐的版本一但不兼容就很容易出差,下载不下来依耐就会导致代码错误

3 封装很多核心代码,很难理解他的底层

3. Spring Boot 自动配置原理是什么?

(1)Spring Boot启动的时候首先加载主配置类,开启了自动配置的功能(@EnableAutoConfiguration)

(2)自动配置功能@EnableAutoConfiguration的作用:它是利用了

@Import(AutoConfigurationImportSelector.class)给容器中导入一些组件。那么,他会给我们导入哪些组件呢?进入AutoConfigurationImportSelector源码看一下部分源码如下。

@Import(AutoConfigurationImportSelector.class)自动配置导入选择

List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);是获取候选的配置,也就是获取所有配置。

getCandidateConfigurations//获取候选配置,核心方法

@AutoConfigurationPackage自动配置包

4. Springboot的跨域处理(跨域是违反了同源策略的情况下需要跨域)

  Cross-origin 来处理,后台我们可以加注解:@CrossOrigin

5. spring的事务传播特性:

REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 

SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 

MANDATORY :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 

REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。 

NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。 

NEVER :以非事务方式运行,如果当前存在事务,则抛出异常。 

NESTED :如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED 。 

指定方法:通过使用 propagation 属性设置,例如:@Transactional(propagation = Propagation.REQUIRED)

七、Mybaits的知识

1,Mybaits工作流程:

 1、加载配置文件。需要加载的配置文件包括全局配置文件(mybatis-Config.xml)和SQL(Mapper.xml)映射文件,其中全局配置文件配置了Mybatis的运行环境信息(数据源、事务等),SQL映射文件中配置了与SQL执行相关的信息。

2、创建会话工厂。MyBatis通过读取配置文件的信息来构造出会话工厂(SqlSessionFactory)。

3、创建会话。拥有了会话工厂,MyBatis就可以通过它来创建会话对象(SqlSession)。会话对象是一个接口,该接口中包含了对数据库操作的增删改查方法。

 4、创建执行器。因为会话对象本身不能直接操作数据库,所以它使用了一个叫做数据库执行器(Executor)的接口来帮它执行操作。

5、封装SQL对象。在这一步,执行器将待处理的SQL信息封装到一个对象中(MappedStatement),该对象包括SQL语句、输入参数映射信息(Java简单类型、HashMap或POJO)和输出结果映射信息(Java简单类型、HashMap或POJO)。

6、操作数据库。拥有了执行器和SQL信息封装对象就使用它们访问数据库了,最后再返回操作结果,结束流程。

2,#和$符号的区别

(1)# 自动加上’’,$不会自动加上’’

(2)# 可以防止sql注入:#{}是经过预编译的,是安全的。

而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

3,Mybatis的一级、二级缓存:

一级缓存: 默认开启

一级缓存是SqlSession级别的缓存(默认是支持一级缓存,不需要再配置文件中配置一级缓存),当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据写到内存中,第二次查询不执行sql直接从内存中获取。

二级缓存:二级缓存是mapper级别的缓存,使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,则第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

Mybatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存。

 

(1)让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置setting的cacheEnabled属性)

(2)让当前的映射文件支持二级缓存(在IUserDao.xml中配置)

(3)让当前的statement支持二级缓存(在select标签中配置)

4,Mybatis动态sql有什么用?执行原理?有哪些动态sql?

什么是动态sql :根据不同的条件执行不同的sql语句,执行原理是根据表达式的值 完成逻辑判断,并动态拼接sql的功能。

动态sql的实现:

<select id = "findByCondition" parameterType = "user" resultType = "user">

    SELECT * FROM User

    <where>

        <if test = "id != 0">

            AND id = #{id}

        </if>

    </where>

</select>

有哪些动态sql:

Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。

5,介绍一下通用Mapper

通用Mapper就是为了解决单表增删改查,基于Mybatis的插件。开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法。

6, mybatisPlus

 是一个mybatis的增强工具,在mybatis的基础上做增强不做改变,为简化开发,提高效率而生

7,mybaits的分页

(1)可以通过mybaitsplug插件的Page类,

(2)也可以直接写sql语句用limit如select *from user limit 1,2

(3)PageHelper插件实现分页

8,mybatis的底层

mybatis 是一个数据库框架,底层封装了jdbc,简化了开发人员的开发

9,Mybaits有几种分页方式

 

 

 

八、Nginx的面试题

一,Nginx是什么,有什么作用

Nginx (engine x) 是一个轻量级的是一个高性能的HTTP和反向代理服务器,其特点是占有内存少,并发能力强

主要是用来反向代理和实现负载均衡.

 

二nginx是怎么进行反向代理的

  1. Nginx首先需要监听特定的域名.
  2. 当用户根据域名进行资源访问时.首先会访问nginx
  3. 之后nginx代替请求者根据内部的配置文件,实现反向代理.将请求转化为特定的请求路径进行资源访问.
  4. 当Nginx获取资源后将数据返回给用户.完成请求的正确的响应.

负载均衡:访问量高时,可以让服务器尽量分摊压力,

三,什么是正向代理

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标原始服务器,然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

特点:

1.客户端可以使用正向代理(正向代理是客户端代理)

2.正向代理 用户非常清楚自己访问服务器的地址, 服务器不知道真实的请求者是谁

3.应用场景:   美团外卖,滴滴打车,路由器机制

四,什么是反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

特点:

1. 服务器端使用反向代理( 服务器端代理)

2. 反向代理  用户访问服务器时,用户不清楚真实的服务器到底是谁, 服务器清楚是谁访问的.

3. 使用场景:  一般服务器端都是反向代理

五,Nginx负载均衡机制

1.轮询机制 根据配置文件的顺序,依次访问服务器. 默认的负载均衡策略

2.权重策略 如果需要设定访问服务器的频次(某个访问的多,某个访问的少),可以通过权重的策略实现.  

  例如: server localhost:8091 weight=9;

3.IPHASH 如果需要用户与服务器进行绑定时,则设定IPHash

六,Nginx 有哪些优点?

1.跨平台、配置简单。

2.非阻塞、高并发连接   2-3 万并发连接数,官方监测能支持 5 万并发。

3.内存消耗小 1个服务不超过2M

4.成本低廉,且开源。

5.稳定性高,宕机的概率非常小。  

八、Springcloud部分

netflix公司将他们内部的微服务技术架构进行了开源,在互联网行业产生了很大的影响力,然后接着就被整合到了spring社区,变成了spring cloud项目。但是现在已经netflix已经不维护了

Springcloud的组件:

eureka做注册中心、

feign和ribbon结合实现远程过程调用和负载均衡、

zuul做网关、

hystrix做熔断,

用zipkin和sleuth做链路监控

 

 

1. spring ,springboot和springcloud的区别

           spring:是一个框架一个容器,里面有一些很好的功能ioc和aop

      springboot :基本上是spring框架的扩展,它消除了XML配置,是一个快速的开发框架,是单体微服务开发

     Springcloud:是一个微服务的框架,可以多体开发,有多个组件组成,里面包含springboot,如果说springboot一个项目就是一个微服务,springcloud就是由多个微服务组成的,通过几个组件来管理整个项目

Springcloud Alibaba

 

 

Spring Cloud Alibaba 是Spring Cloud的一个子项目,是一个微服务框架,方便开发人员通过 Spring Cloud 轻松使用这些组件来开发分布式项目,

 

使用 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

Spring Cloud Alibaba 的组件:

(1)注册配置中心:nacos

(2)feign和ribbon结合实现远程过程调用和负载均衡

(3)Gateway 网关

(4)Sentinel 限流 限流的算法(计数器、令牌桶、漏斗算法,滑动窗口算法)

(4)ZipKin(数据追踪系统)

         Nacos面试题

我们的服务实例是如何注册到Nacos服务的?(Nacos本身就是一个web服务,我们将将一些数据传递到这个web服务,然后在我们的业务服务启动时会向nacos发起一个http请求,然后nacos服务端从请求中读取数据并进行存储)

在Nacos中服务提供者是如何向Nacos注册中心(Registry)续约的?(5秒心跳)

对于Nacos服务来讲它是如何判定服务实例的状态?(检测心跳包,15,30)

服务启动时如何找到服务启动注册配置类?(NacosNamingService)

服务消费方是如何调用服务提供方的服务的?(RestTemplate)

Nacos中的负责均衡底层是如何实现的?(通过Ribbon实现)

Ribbon 是什么?(Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法)

Ribbon 可以解决什么问题? (基于负载均衡策略进行服务调用, 所有策略都会实现IRule接口)

Ribbon 内置的负载策略都有哪些?(8种,可以通过查看IRule接口的实现类进行分析)

@LoadBalanced的作用是什么?(描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。)

我们可以自己定义负载均衡策略吗?(可以,基于IRule接口进行策略定义)

RestTemplate 有什么用?(远程服务调用,跨进程调用,底层封装了http请求的访问方式,例如直接基于HttpClient发送客户端请求)

RestTemplate 有负载均衡功能吗?(没有,负载均衡需要通过Ribbon实现,加如需要使用Ribbon实现负载均衡,可以在RestTemplate对象构建时使用@LoadBalance注解对构建RestTemplate对象的方法进行描述)

RestTemplate 常用方法有哪些?(put,get,delete,post,…)

RestTemplate 底层应用协议?(Http协议)

  •  Nacos是什么,提供了什么特性(服务的注册、发现、配置)?
  • 你为什么会选择Nacos?(活跃度、稳定、性能、学习成本)
  • Nacos的官网?(nacos.io)
  • Nacos在github的源码?(github.com/alibaba/nacos)
  • Nacos在windows环境下安装?(解压即可使用)
  • Nacos在windows中的的初步配置?(application.properties访问数据库的数据源)
  • Nacos服务注册的基本过程?(服务启动时发送web请求)
  • Nacos服务消费的基本过程?(服务启动时获取服务实例,然后调用服务)
  • Nacos服务负载均衡逻辑及设计实现?(Ribbon)
  • 注册中心的核心数据是什么?(服务的名字和它对应的网络地址)
  • 注册中心中心核心数据的存取为什么会采用读写锁?(底层安全和性能)
  • Nacos健康检查的方式?(基于心跳包机制进行实现)
  • Nacos是如何保证高可用的?(重试,本地缓存、集群)
  • Nacos安装、启动、服务的注册、发现机制以及实现过程?
  • 何为注册中心?(用于记录服务信息的一个web服务,例如淘宝平台,滴滴平台,美团外卖平台,…..)
  • 注册中心的核心对象?(服务提供方,服务消费方,注册中心-Registry)
  • 市面上常用注册中心?(Google-Consul,Alibaba-Nacos,…)
  • 微服务架构下项目的构建过程?
  •  

     Feign 的面试题

 

服务消费方基于rest的请求服务提供方的服务时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次服务调用都需要这样拼接,带码量复杂且不易维护,此时Feign诞生。

Feign是什么

Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现

为什么使用feign?(基于Feign可以更加友好的实现服务调用,简化服务消费方对服务提供方方法的调用)

@FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)

Feign方式的调用,底层负载均衡是如何实现的?(Ribbon)

@EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类)

  • Feign的基本应用以及底层底层调用原理?
  • Feign是什么,它的应用是怎样的,feign应用过程中的代理对象是如何创建的(JDK)?
  • Feign方式的调用过程,其负载均衡是如何实现?(Ribbon)

 

Sentinel的面试题

Sentinel是什么?(阿里推出一个流量控制平台,防卫兵)

类似Sentinel的产品你知道有什么?(hystrix)

你了解哪些限流算法?(计数器、令牌桶、漏斗算法,滑动窗口算法,…)

Sentinel 默认的限流算法是什么?(滑动窗口算法)

  • 你了解sentinel中的阈值应用类型吗?(两种-QPS,线程数)
  • Sentinel 限流规则中默认有哪些限流模式?(直连,关联,链路)
  • Sentinel的限流效果有哪些?(快速失败,预热,排队)
  • Sentinel 为什么可以对我们的业务进行限流,原理是什么?

我们在访问web应用时,在web引用内部会有一个拦截器,这个拦截器会对请求的url进行拦截,拦截到请求以后,读取sentinel 控制台推送到web应用的流控规则,基于流控规则对流量进行限流操作。

  • 何为降级熔断?(让外部应用停止对服务的访问,生活中跳闸,路障设置-此路不同)
  • 为什么要进行熔断呢?(一般服务不稳定,例如平均响应速度越来越慢或经常出现异常,这样可能会导致调用链堆积,最终系统崩溃)
  • Sentinel中限流,降级的异常父类是谁?(BlockException)
  • Sentinel 出现降级熔断时,系统底层抛出的异常是谁?(DegradeException)
  • Sentinel中异常处理接口是谁?(BlockExceptionHandler)
  • Sentinel中异常处理接口下默认的实现类为? (DefaultBlockExceptionHandler)
  • 假如Sentinel中默认的异常处理规则不满足我们的需求怎么办?(自己定义)
  • 我们如何自己定义Sentinel中异常处理呢?(

直接或间接实现BlockExceptionHandler接口,并将对象交给spring管理)

  • Sentinel 降级熔断策略有哪些?(慢调用,异常比例,异常数)
  • Sentinel 熔断处理逻辑中的有哪些状态?(Open,HalfOpen,Closed)
  • Sentinel 对服务调用进行熔断以后处于什么状态?(熔断打开状态-Open)
  • Sentinel 设置的熔断时长到期以后,Sentinel的熔断会处于什么状态?(探测-HalfOpen,假如再次访问时依旧响应时间比较长或依旧有异常,则继续熔断)
  • Sentinel 中的熔断逻辑恢复正常调用以后,会出现什么状态?(熔断关闭-closed)

 

Gateway 的面试题

 

 

  • 什么是网关?服务访问(流量)的一个入口,类似生活中的“海关“
  • 为什么使用网关?(服务安全,统一服务入口管理,负载均衡,限流,鉴权)
  • Spring Cloud Gateway 应用的初始构建过程(添加依赖,配置)
  • Gateway 服务的启动底层是通过谁去实现的?(Netty网络编程框架-ServerSocket)
  • Gateway 服务做请求转发时一定要在注册中心进行注册吗?(不一定,可以直接通过远端url进行服务访问)

ZikPin的面试题

  • 为什么要进行链路监控?(及时发现问题、找到问题并解决问题)
  • 你了解市场那些链路监控产品?(zipkin/skywalking)
  • Zipkin进行链路监控的过程是怎样的?

Zipkin 进行链路监控时有什么缺陷吗?(性能问

 

 

    Redis

Redis 是什么?都有哪些使用场景?

Redis 是一个key-value存储系统,是一个分布式缓存数据库

Redis 使用场景:缓存文章详情信息; 记录用户会话信息。

Redis 有哪些功能?

数据缓存功

支持消息队列

Redis 和 memcache 有什么区别?

存储方式不同:memcache 把数据全部存在内存之中,断电后会挂

掉,数据不能超过内存大小;Redis 有部份存在硬盘上,这样能保证数据的持久性。

数据支持类型:memcache 对数据类型支持相对简单;Redis 有复杂的数据类型。

使用底层模型不同:它们之间底层实现方式,以及与客户端之间通信的应用协议不一样,Redis 自己构建了 vm 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

value 值大小不同:Redis 最大可以达到 1gb;memcache 只有1mb。

Redis 为什么是单线程的?

 

因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。

关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表。

什么是缓存穿透?怎么解决?

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查

询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存   在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短, 最长不超过五分钟。

Redis 支持的数据类型有哪些?

Redis 支持的数据类型:string(字符串)、list(列表)、hash(字典)、

set(集合)、zset(有序集合)。

Redis 支持的 Java 客户端都有哪些?

支持的 Java 客户端有 Redisson、jedis、lettuce 等。

jedis 和 Redisson 有哪些区别?

jedis:提供了比较全面的 Redis 命令的支持。

Redisson:实现了分布式和可扩展的 Java 数据结构,与 jedis 相比Redisson 的功能相对简单,不支持排序、事务、管道、分区等 Redis 特性。

怎么保证缓存和数据库数据的一致性?

合理设置缓存的过期时间。

新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。

Redis 持久化有几种方式?

Redis 的持久化有两种方式,或者说有两种策略:

  • RDB方式会对redis中的数据执行周期性的持久化或手动save操作实现持久化。
  • AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集。

 

Redis 怎么实现分布式锁?

 

Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。

占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁。

Redis 分布式锁有什么缺陷?

Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如

果超出了锁的超时时间就会出现问题。

Redis 如何做内存优化?

尽量使用 Redis 的散列表,把相关的信息放到散列表里面存储,而不是把每个

字段单独存储,这样可以有效的减少内存使用。比如将 Web 系统的用户对象, 应该放到散列表里面再整体存储到 Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置 key 进行存储。

Redis 淘汰策略有哪些?

volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)

中挑选最近最少使用的数据淘汰。

volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑选将要过期的数据淘汰。

volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中任意选择数据淘汰。

allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。

allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘

汰。

no-enviction(驱逐):禁止驱逐数据。

Redis 常见的性能问题有哪些?该如何解决?

主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能

影响是非常大的,会间断性暂停服务,所以主服务器最好不要写内存快照。

Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性, 主从库最好在同一个局域网内。

缓存雪崩

缓存雪崩,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常

缓存雪崩解决方案:

  1. 给缓存的失效时间,加上一个随机值,避免集体失效。
  2. 使用互斥锁,但是该方案吞吐量明显下降了。
  3. 双缓存。我们有两个缓存,缓存 A 和缓存 B。缓存 A 的失效时间为 20 分钟,缓存 B 不设失效时间。自己做缓存预热操作。

双缓存的实现过程:从缓存 A 读数据库,有则直接返回;A 没有数据,直接从 B 读数据,直接返回,并且异步启动一个更新线程,更新线程同时更新缓存 A 和缓存 B。

 

 

缓存穿透

特点:用户高并发环境下,访问数据库中根本不存在的数据.

影响:由于用户高并发访问,则数据库可能存在宕机的风险.

缓存击穿

说明:由于用户高并发的访问.访问的数据刚开始有缓存,但是由于特殊原因导致缓存失效.

 


版权声明:本文为qq_56895799原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。