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)这个配置文件
2. spring mvc 工作流程
1、首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控 #技术分享制器的控制逻辑部分;2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;4、前端控制器再次收回控制权,将响应返回给用户。
3. 请简述一下IO流?
IO 流用来处理设备之间的数据传输,Java 程序中,对于数据的输入/输出操作 都是以“流”的方式进行的。java.io 包下提供了各种“流”类的接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
对于计算机来说,数据都是以二进制形式读出或写入的。我们可以把文件想象为一个桶,我们可以通过管道将桶里的水抽出来。这里的管道也就相当于 Java 中的流。流的本质是一种有序的数据集合,有数据源和目的地。输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。输出:将程序(内存)数据输出到磁盘、光盘等存储设备中。
流的分类按照流的方向(输出输入都是站在程序所在内存的角度划分的) 输入流:只能从中读数据 输出流:只能向文件中写数据
字节流:将数据解释为原始的二进制数据 ,读写均为字节数据,二进制数据不需要编码和解码,比文本 Io 效率更高,可移植(与主句编码方式无关)
字符流:将数据解释为字符数据,字符流将原始数据解析成一种字符,文本数据存储 依赖文件编码方式,它输入输出需要编码解码。
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记及答案可以在文末获取
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 一个字段都会把整个表锁起来,而I nnodb ,对一些小的应用,它比 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 四大特性
- 原子性:不可分割,事务要么全部被执行,要么全部不执行。
- 一致性:事务的执行使得数据库从一种正确的状态转换成另一种正确的状态。
- 隔离性:在事务正确提交前,不允许把该事务对数据的任何改变提供给任何其他事务。
- 持久性:事务正确提交后,将结果永久保存到数据库中,即使在事务提交后,有了其他故障,事务处理结果也会得到保存。
索引的目的是什么
- 快速访问数据表中特定信息,提高检索速度。
- 创建唯一性索引,保证每一行数据的唯一性。
- 加速表和表之间的连接。
- 使用分组和排序子句进行数据检索时,可显著的减少分组和排序的时间。
对 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 :串行事务
- 可避免脏读、不可重复读、幻读
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()关闭会话
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记及答案可以点击下方名片获取