2024最全java面试题整理(持续更新)
MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1. springboot项目和maven项目的区别?
(1)打包方式:传统项目如果需要打成war包,需要在WEB-INF目录结构配置web.xml文件;springboot则不需要
(2)项目启动方式:
传统web项目启动方式:在eclipse和tomcat插件中导入项目,然后启动tomcat,项目也启动了。或者将项目打成war包,放入tomcat中,启动tomcat。
采用springboot项目启动:如下图所示,打开HelloWorldApplication.java(这个类每个项目都有,类名自定),这是一个带有main方法的类,点击main方法,右键run as -java application。
(3)配置文件的区别:
二者的配置文件都是放在src/main/resources下面
传统项目:配置文件较多,必须包含applicationContext.xml这个核心配置文件
采用springboot项目:配置文件较少,相比传统项目,可以说配置文件极少,必须包含application.properties(或者是application.yml)这个配置文件
篇幅限制下面就只能给大家展示小册部分内容了。包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套资料及答案的【点击此处即可,免费获取】 备注:“CSDN”
2. spring mvc 工作流程
1、首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;
2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);
3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;
4、前端控制器再次收回控制权,将响应返回给用户。
3. 请简述一下IO流?
IO流用来处理设备之间的数据传输,Java程序中,对于数据的输入/输出操作 都是以“流”的方式进行的。java.io包下提供了各种“流”类的接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
对于计算机来说,数据都是以二进制形式读出或写入的。我们可以把文件想象为一个桶,我们可以通过管道将桶里的水抽出来。这里的管道也就相当于Java中的流。流的本质是一种有序的数据集合,有数据源和目的地。
输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出:将程序(内存)数据输出到磁盘、光盘等存储设备中。
流的分类
按照流的方向(输出输入都是站在程序所在内存的角度划分的)
输入流:只能从中读数据
输出流:只能向文件中写数据
字节流:将数据解释为原始的二进制数据 ,读写均为字节数据,二进制数据不需要编码和解码,比文本Io效率更高,可移植(与主句编码方式无关)
字符流:将数据解释为字符数据,字符流将原始数据解析成一种字符,文本数据存储 依赖文件编码方式,它输入输出需要编码解码。
需要全套资料及答案的【点击此处即可】 备注:“免费领资料”
4. 关系型数据库和非关系型数据库?
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
当今十大主流的关系型数据库 Oracle,Microsoft SQL Server,MySQL,PostgreSQL,DB2, Microsoft Access, SQLite,Teradata,MariaDB(MySQL的一个分支),SAP
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能较差,尤其是海量数据的高效率读写;
2、硬盘I/O要求高:网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈
3、拓展困难
4、性能欠佳:在关系型数据库中,导致性能欠佳的最主要原因是多表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询。为了保证数据库的ACID特性(原子性、一致性、隔离性、持久性),必须尽量按照其要求的范式进行设计,关系型数据库中的表都是存储一个格式化的数据结构。
非关系型数据库指非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、查询便捷:可以根据需要去添加自己需要的字段,为了获取用户的不同信息,不像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。
3、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
4、高扩展性:Nosql基于键值对,数据之间没有耦合性,所以非常容易水平扩展。关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
5、成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、只适合存储一些较为简单的数据,对于需要进行较复杂查询的数据,关系型数据库显的更为合适。
4、不适合持久存储海量数据
常见的非关系型数据库有redis,mongdb,Hbase。
5. MySQL数据库
优化SQL
- 选择正确的存储引擎。
每个引擎都有利有弊,比如MyISAM
,适用于大量查询,对大量写操作并不是很好,update
一个字段都会把整个表锁起来,而Innodb
,对一些小的应用,它比MyISAM
慢,但它支持行锁,再写操作的时候,很优秀,它还支持更多的高级应用。 - 优化字段的数据类型
一个原则,越小的越快,如果一个表只有几列,那我们就不用用INT
来做主键,可以使用MEDIUMINT
,SMALLINT
或是更小的TINYINT
会更经济一些,如果不需要记录时间,使用DATE
要比DATETIME
好的多,也要留够足够的空间进行扩展。 - 为搜索字段添加索引
索引不一定只添加给主键或唯一的字段,如果在表中有某个字段经常用来做搜索,那就为它建立索引,如果要搜索的字段是大的文本字段,那应该为它建立全文索引。 - 避免使用
select *
因为从数据库读出的数据越多,那么查询就会越慢。如果数据库服务和WEB服务器在不同的机器上的话,还会增加网络传输的负载。即使要查询表的所有字段,也尽量不要用*
通配符。 - 使用
ENUM
而不是VARCHAR
ENUM
类型是非常快和紧凑的,它保存的是TINYINT
,但外表上显示的是字符串,做一些选项列表很好,比如:性别,民族,部门,状态之类的字段,取值有限而且固定。 - 尽可能使用
NOT NULL
NULL
其实也需要额外空间的,在进行比较的时候,程序也会变得复杂,并不是并不可以用NULL
,在现实的复杂情况下,依然会有些情况需要使用NULL
值。 - 固定长度的表会更快
如果表中的所有字段都是固定长度的,那整个表会被认为是“static”
或“fixed-lenght”
。例如表中没有VARCHAR
,TEXT
,BLOB
,只要表中其中一个字段是这些类型,那么这个表就不是“固定长度静态表”了,这样的话MySQL
引擎会用另一种方法来处理。
固定长度的表也容易被缓存和重建,唯一的副作用就是,固定长度的字段会浪费一些空间,因为固定长度的字段无论用不用,都会分配那么多的空间。
需要全套资料及答案的【点击此处即可】 备注:“免费领资料”
为什么要避免使用join查询
减少消耗。
对于大流量网站,如何解决各页面统计访问量问题
- 确认服务器是否能支撑当前访问量
- 优化数据库访问
- 禁止外部访问,如图片盗链
- 控制文件下载
- 使用不同主机进行分流
- 使用浏览统计软件,了解访问量,有针对性的进行优化
SQL
注入的主要特点
- 变种极多,攻击简单,危害极大。
- 未经授权操作数据库的数据。
- 恶意篡改网页。
- 网页挂木马。
- 私自添加系统账号或是数据库使用者账号。
优化数据库的方法
- 选取最适合的字段属性,尽可能减少定义字段宽度,尽量把字段设成
NOT NULL
。 - 使用
exists
替代in
,用not exists
替代not in
。 - 使用连接
(JOIN)
来替代子查询。 - 适用联合
(NUION)
来代替手动创建的临时表。 - 事务处理。
- 锁定表,优化事务处理。
- 适当用外键,优化锁定表。
- 建立索引。
- 优化查询语句。
数据库中的事务是什么
事务作为一个单元的一组有序的数据操作,如果组中的所有操作都完成,则认定事务成功,即使只有一个失败,事务也不成功。如果所有操作完成,事务则进行提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有的操作的影响都会取消。
ACID
四大特性- 原子性:不可分割,事务要么全部被执行,要么全部不执行。
- 一致性:事务的执行使得数据库从一种正确的状态转换成另一种正确的状态。
- 隔离性:在事务正确提交前,不允许把该事务对数据的任何改变提供给任何其他事务。
- 持久性:事务正确提交后,将结果永久保存到数据库中,即使在事务提交后,有了其他故障,事务处理结果也会得到保存。
索引的目的是什么
- 快速访问数据表中特定信息,提高检索速度。
- 创建唯一性索引,保证每一行数据的唯一性。
- 加速表和表之间的连接。
- 使用分组和排序子句进行数据检索时,可显著的减少分组和排序的时间。
需要全套资料及答案的在【翻到文章底部,点击名片】即可免费获取 备注:“CSDN”
对SQL语句的优化方法
- 避免在索引列上使用计算。
- 避免在索引列上使用
IS NULL
和IS NOT NULL
。 - 对查询进行优化,尽量避免全表扫描,首先因该考虑在
where
和order by
涉及的列上建立索引。 - 避免在
where
子句对字段进行null值判断,这件导致引擎放弃使用索引而进行全表扫描。 - 避免在
where
子句中对字段进行表达式操作,也会导致引擎放弃使用索引而进行全表扫描。
char和varchar的区别
- char
类型的数据列里,每个值都占
M个字节,如果长度小于
M`,就会在它的右边用空格字符进行补足(在检索操作中填补出来的空格符将会被去掉)。 vachar
类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录长度的字节,所以总长度为L+1
字节。
SQL问题
-
脏读
-
在一个事务处理过程中读取到了另一个未提交事务中的数据。
【例子】
A在一个转账事务中,转了100给B,此时B读到了这个转账的数据,然后做了一些操作(给A发货,或是其他),可是这个时候A的事务并没有提交,如果A回滚了事务,那这就是脏读。
-
不可重复读
-
对数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,是由于在查询间隔,被另一个事务修改并提交了。
【示例】
事务A在读取某一数据,而事务B立马修改了这个数据并且提交了事务到数据库,事务A再次读取就得到了不同的结果。发生了不重复读。
-
幻读
-
事务非独立执行时发生的一种现象。
【示例】
事务A对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务B又对这个表中插入了一行数据项,这个数据的数值还是“1”并且提给了数据库,如果事务A查看刚刚修改的数据,会发现还有一数据没有修改,而这行数据时事务B中添加的,就像产生的幻觉一样。发生了幻读。
MySQL事务隔离级别
read uncmmited
:读到未提交数据
- 最低级别,无法保证任情况
read commited
:读已提交
- 可避免脏读
repeatable read
:可重复读
- 可避免脏读、不可重复读
serializable
:串行事务
- 可避免脏读、不可重复读、幻读
需要全套资料及答案的【点击此处即可】编辑https://bbs.csdn.net/topics/618656674备注:“免费领资料”
MySQL默认事务隔离级别为Repeatable Read(可重复读)】
MySQL临时表
什么是临时表:临时表是MySQL
用于存储中间结果集的表,临时表只在当前连接可看,当连接关闭时会自动删除表并释放所有空间。
为什么会产生临时表:一般是因为复杂的SQL
导致临时表被大量创建
6. MyBatis?
简介
MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。
为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
JDBC开发存在的问题
频繁创建数据库连接对象、释放,容易造成系统资源浪费,影响系统性能。可以使用连接池解决这个问题。但是使用jdbc需要自己实现连接池。
sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。
使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
结果集处理存在重复代码,处理麻烦。如果可以映射成Java对象会比较方便。
JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
解决:在mybatis-config.xml中配置数据链接池,使用连接池管理数据库连接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决: Mybatis自动将java对象映射至sql语句。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。
Mybatis优缺点
优点:
与传统的数据库访问技术相比,ORM有以下优点:
基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用
与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接
很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)
提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护
能够与Spring很好的集成
需要全套资料及答案的【点击此处即可】 备注:“免费领资料”
缺点:
SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
MyBatis编程步骤是什么样的?
1、 创建SqlSessionFactory
2、 通过SqlSessionFactory创建SqlSession
3、 通过sqlsession执行数据库操作
4、 调用session.commit()提交事务
5、 调用session.close()关闭会话
更多推荐
所有评论(0)