参加面试被问到的面试题
1.在程序中如何开启事务?
在Java中,使用JDBC(Java Database Connectivity)与数据库交互时,你可以使用Connection
对象的setAutoCommit
方法来控制事务。默认情况下,autoCommit
是开启的,这意味着每次执行SQL语句都会立即提交。为了开启一个事务,你需要关闭autoCommit
,然后在完成所有操作后显式地调用commit
或rollback
。
在MySQL中是通过START TRANSACTION; 开启事务;
2.事务是什么,举个实际的例子?
事务(Transaction)是数据库管理系统执行过程中的一个逻辑单位,它是一个不可分割的工作单位。事务可以把一系列对数据库的多个操作当作一个单一的工作单元来执行,从而保证数据库从一个一致性状态转变到另一个一致性状态。
两个update操作就可以通过start transaction开启事务之后,然后都执行之后通过commit提交事务;
3.MySQL的存储过程是什么?
MySQL的存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字和参数(如果有的话)来调用并执行它。存储过程可以包含逻辑控制语句和数据操纵语句,并且可以接受参数、输出参数、返回单个或多个结果集以及返回值。
4.Java能否实现MySQL存储过程的功能?如果能,区别是什么?
-
封装数据库逻辑在Java方法中: 你可以将复杂的数据库操作逻辑封装在Java的方法中。这些方法可以包含多个SQL语句,并且可以使用JDBC或更高级的框架(如Hibernate, MyBatis等)来执行这些语句。这样,其他Java代码就可以像调用存储过程一样调用这些封装好的方法。
-
使用Spring框架的@Repository和@Service注解: Spring框架提供了一种声明式的方式来处理数据库操作。通过@Repository注解,你可以创建数据访问对象(DAO),这些对象封装了与数据库交互的逻辑。而@Service注解则用于创建服务层,这些服务层可以调用一个或多个DAO来执行复杂的业务逻辑。这样,业务逻辑就被封装在服务层的方法中,类似于存储过程。
5.axios的get请求和post请求的区别?
-
请求方式:
-
axios.get用于发送GET请求,通常用于从服务器获取数据。
-
axios.post用于发送POST请求,通常用于向服务器提交数据进行处理请求,如提交表单或者上传文件。
-
参数传递方式:
-
axios.get通过params属性传递参数,数据会附加在URL后面,因此数据在URL中可见。
-
axios.post则通过data属性传递参数,数据作为请求体发送,不会在URL中显示。
-
数据发送方式:
-
axios.get请求没有请求体,只有请求头。
-
axios.post请求会把数据作为请求体发送。
-
安全性:
-
由于GET请求的数据会被附加到URL中,因此这些数据可能会被浏览器历史记录或服务器日志记录,存在数据泄露或篡改的风险。
-
POST请求的数据则作为请求体发送,不会被缓存到浏览器历史记录或服务器日志中,相对更为安全。
-
数据大小限制:
-
GET请求提交的数据大小受到限制,通常不能大于2KB。
-
POST请求则没有这样的限制。
6.cookie和session的区别?
首先,从数据存放位置来看,Cookie数据存放在客户的浏览器上,而Session数据则放在服务器上。这意味着Cookie信息可以直接在客户端(如用户的浏览器)上访问和修改,而Session数据则必须通过服务器进行访问和管理。
其次,从安全性的角度考虑,Cookie相对不那么安全。因为Cookie数据存储在客户端,所以他人可以分析并可能进行Cookie欺骗。相比之下,Session数据存储在服务器端,因此更加安全。
再来看性能使用程度,Session会在一定时间内保存在服务器上。当访问量增大时,服务器需要处理更多的Session数据,这可能会增加服务器的负担。而Cookie则主要存储在客户端,对服务器性能的影响较小。因此,从减轻服务器性能负担的角度来看,使用Cookie可能更为合适。
最后,从数据存储大小来看,单个Cookie保存的数据不能超过4K,且很多浏览器都限制一个站点最多保存20个Cookie。而Session数据存储在服务器端,浏览器对其大小没有限制,因此可以存储更多的信息。
7.localstorage和sessionstorage的区别?
-
生命周期:localStorage的生命周期是永久的,除非用户或脚本显式地删除数据,否则数据会一直保留在浏览器中。相比之下,sessionStorage的生命周期则与特定的浏览器会话或窗口/标签页相关联。当窗口或标签页被关闭时,sessionStorage中的数据就会被清除。
-
作用域:localStorage的作用域是全局的,只要同源(即协议、主机和端口相同),任何页面都可以访问和修改localStorage中的数据。而sessionStorage的作用域则限制在单个窗口或标签页内,不同的窗口/标签页无法共享相同的sessionStorage数据。
-
存储大小:localStorage和sessionStorage的存储大小都有限制,但具体大小取决于浏览器。一般来说,它们都能存储相当数量的数据,对于大多数应用来说应该足够了。
-
数据格式:localStorage和sessionStorage都只能存储字符串类型的数据。如果你需要存储其他类型的数据(如对象或数组),你需要先将其转换为字符串格式,然后再进行存储。在读取数据时,你需要将字符串转换回原始的数据类型。
8.reduce函数是干嘛用的?
reduce()
方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。
这个函数的基本语法如下:
arr.reduce(function(accumulator, currentValue, currentIndex, array) { // 你的代码 }, initialValue);
参数说明:
-
accumulator
(累加器累积器)是累积回调函数的返回值; 它是上一次调用回调时返回的累积值。 -
currentValue
(当前值)是数组中正在处理的元素。 -
currentIndex
(当前索引)是数组中正在处理的元素的索引。如果提供了initialValue
,则索引为0,否则为1。 -
array
(数组)是调用reduce()
的数组。 -
initialValue
(初始值)作为第一次调用callback
函数时的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用reduce
将报错。const numbers = [1, 2, 3, 4]; // 1 + 2 + 3 + 4 const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0); console.log(sum); // 输出:10
9.display几个常用的属性是什么?分别有什么作用?
-
block:当元素的display属性设置为block时,元素会以块级元素的形式显示。块级元素会独占一行,并会在前后自动换行。例如,常见的块级元素有
<div>
、<p>
、<h1>
等,它们通常用于构建网页的结构。 -
inline:将元素的display属性设置为inline时,元素会以内联元素的形式显示。内联元素不会独占一行,而是与其他内联元素在一行上显示。常见的内联元素有
<span>
、<a>
、<strong>
等,它们通常用于包裹文本或内联内容。 -
inline-block:这个属性值结合了inline和block的特点。设置为inline-block的元素既可以在一行上显示,又能设置宽度和高度等属性。这使得inline-block在布局时具有更大的灵活性。
-
none:将元素的display属性设置为none时,元素将不会被显示。同时,该元素不会占据页面上的任何空间,就像它从未存在过一样。这是控制元素显示和隐藏的一种方式。
-
flex:使用flex属性值可以将元素设置为弹性盒模型布局。在这种布局中,子元素(弹性项)可以在父元素(弹性容器)中沿行或列方向进行灵活的排列和对齐。flex布局在现代网页设计中非常常用,它可以帮助开发者实现复杂的布局需求。
-
grid:grid属性用于创建网格布局,这是一种二维布局系统,可以同时处理行和列。在网格布局中,元素被放置在由行和列创建的单元格中,提供了更大的布局灵活性和控制能力。
10.position的常用属性和作用?
-
static:这是默认值。元素按照正常流进行布局,不进行任何特殊定位。它会出现在正常的文档流中,忽略任何top、bottom、left、right或者z-index声明。
-
relative:生成相对定位的元素。这意味着元素会相对于它在正常流中的默认位置进行偏移。通过top、bottom、left、right的设置,可以调整元素的位置。同时,relative定位的元素不会脱离文档流,也不会对其他元素的位置产生影响。另外,relative定位的元素可以设置z-index来改变其层次关系。
-
absolute:生成绝对定位的元素。这种定位方式会使元素脱离正常的文档流,其位置是相对于最近的已定位父元素(即position属性不是static的元素)进行定位的。如果没有已定位的父元素,那么它会相对于初始包含块进行定位。元素的位置可以通过left、top、right和bottom属性进行精确控制。absolute定位的元素同样可以通过z-index进行层次分级。
-
fixed:这也是一种绝对定位,但与absolute不同,fixed定位的元素是相对于浏览器窗口进行定位的。无论页面如何滚动,它都会始终位于同一的位置。fixed定位的元素同样脱离文档流,并且其位置可以通过left、top、right和bottom属性进行规定。
-
sticky:粘性定位,是相对于用户的滚动位置进行定位。一个sticky元素在滚动超过其滚动阈值之前为相对定位,之后为固定定位。目前大多数现代浏览器(除了IE)都支持这种定位方式。
11.盒子模型是什么?如何进行布局的?
盒子模型是CSS技术所使用的一种思维模型,它将网页设计页面中的内容元素看作一个个装了东西的矩形盒子。每个矩形盒子都由内容、内边距、边框和外边距4个部分组成。除去内容部分,其余每个部分又分别包含上、下、左和右4个方向,这些方向既可以分别定义也可以统一定义。
盒子模型的布局主要依赖于水平方向和垂直方向上的属性设置。在水平方向上,盒子的大小以及位置可以通过margin-left、border-left、padding-left、width、padding-right、border-right以及margin-right这7个值来调整。这7个值的总和必须等于其父元素内容区的宽度。当这7个值的和不等于父元素内容区宽度时,浏览器会自动调整某些值以满足这个条件。
12.静态变量和实例变量的区别是什么?
-
定义方式:静态变量在定义时前面需要加上
static
关键字,而实例变量则不需要。 -
存储位置:静态变量属于类,也称为类变量。只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间。因此,静态变量可以在不创建对象的情况下,通过类名直接引用。实例变量则属于某个对象的属性,必须创建了实例对象后,其中的实例变量才会被分配空间,才能使用这个实例变量。
-
共享性:静态变量是所有对象共有的,某一个对象将其值改变后,其他对象再去获取它,得到的是改变后的值。而实例变量则是每一个对象私有的,某一个对象将其值改变后,不影响其他对象的取值结果,得到的仍是实例变量一开始被赋予的值。