Java后端面试必备:高频知识点与实战解析(Git/Maven/MySQL/SpringBoot全攻略)

1.面试

To C面向个人,B2B2C(第1个B是指商品或服务的供应商,第2个B是指从事电子商务的企业,C是消费者。例子:腾讯课堂,第1个B是腾讯公司,第2个B是入驻授课的企业,C是用户学习课程)

1.详细说说你的项目吧

从以下几个方面进行项目介绍:

1.项目的背景,包括:是自研还是外包,什么业务,服务的客户群是谁,谁去运营等问题。

2.项目的业务流程

3.项目的功能模块

4.项目的技术架构

5.个人工作职责

6.个人负责模块的详细说明,包括模块的设计,所用到的技术,技术的实现方案等。

例子:

我最近参与的项目是我们公司自研的专门针对成人职业技能教育的网络课程系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训,职业资格证书培训,成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻,课程包括免费和收费两种形式,对于免费课程普通用户可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。

本项目包括三个端:用户端,机构端,运营端。

核心模块包括:内容管理,媒资管理,课程搜索,订单支付,选课管理,认证授权等。

本项目采用前后端分离架构,后端采用SpringBoot,SpringClound技术栈开发,数据库使用了MySQL,还使用的Redis,消息队列,分布式文件系统,Elasticsearch等中间件系统。

我在这个项目中负责了内容管理,媒资管理,订单支付模块的设计与开发。

内容管理模块,是对平台上的课程进行管理,课程的相关信息比较多这里在数据库设计了课程基本信息表,课程营销表,课程计划,课程师资表进行存储,培训机构要发布一门课程需要填写课程基本信息,课程营销信息,课程计划信息,填写完毕后需要提交审核,由运营人员进行课程信息的审核,整个审核过程是程序自动审核加人工确定的方式,通常24小时审核完成。课程审核通过即可发布课程,课程的相关信息会聚合到课程发布表中,这里不仅要将课程信息与到课程发育表还要将课程信息写到索引库,分布式文件系统中,所以这里存在分布式事务的问题,项目使用本地消息表加任务调度的方式去解决这里的分布式事务,保存数据的最终一致性。


2.Git代码冲突怎么处理?

在使用Git时难免会出现代码冲突的问题,出现冲突的原因是因为当本地文件的版本与目标分支中文件的版本不一致时当存在同一行的内容不同时在进行合并时会出现冲突。

代码冲突一般发生在以下情况:

1.多个分支向主分支合并时

2、同一个分支下pull或push操作时

发生了冲突需要手动合并代码,选择最终的版本,可以通过图形界面,如下:


3.Maven

mvn clean   清楚target目录中的生成结果

mvn compile  编译源代码

mvn test  执行单元测试

mvn package 打包

mvn install 打包并把打好的包上传到本地仓库

mvn deploy 打包并把打好的包上传到远程仓库


maven依赖版本冲突怎么处理?

maven依赖版本冲突一般是由于间接依赖导致一个jar包既有多个不同的版本,比如:A依赖了B的1.0版本,C依赖了B的2.0版本,项目依赖A和C从而间接依赖了B的1.0和2.0版本,此时B有两个版本引入到了项目中,当存在版本冲突时可能会出现ClassNotFoundException,NoSuchMethodError等错误。

处理版本冲突可以使用一下方法:

1.使用exclusions排除依赖

2.使用dependencyManagement锁定版本号

通常在父工程对依赖的版本统一管理。


4.Mysql

1.MySQL常见的存储引擎及区别?

一.InnoDB

1.支持事务。

2.使用的锁粒度默认为行级锁,可以支持更高的并发,也支持表锁。

3.支持外键约束;外键约束其实降低了表的查询速度,增加了表之间的耦合度。

二.MyISAM

1.不提供事务支持

2.只支持表级锁

3.不支持外键

三。memory

数据存储在内存中

总结:MySIAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果在应用中执行大量SELECT操作,应该选择这个。

InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,应该选这个。


MySQL建表时需要注意什么?

1.注意选择存储引擎,如果要支持事务选择InnoDB。

2.注意字段类型的选择,对一日期类型如果要记录时分秒建议使用datetime,只记录年月日使用date类型;对于字符类型的选择,固定长度字段选择char,不固定长度的字段选择varchar,varchar比char节省空间但速度没有char快;对于内容介绍类的长文本字段使用text或longtext类型;如果存储图片等二进制数据使用blob或longblob类型;对金额字段建议使用decimal;对于数值类型的字段在确保取值范围足够的前提下尽量使用占用空间较小的类型。

3.主键字段建议使用自然主键,不要有业务意义,建议使用int unsigned类型,特殊场景使用bigint类型。

4.如果要存储text、blob字段建议单独建一张表,使用外键关联。

5.尽量不要定义外键,保证表的独立性,可以存在外键意义的字段,也就是说不要使用物理外键,尽量使用逻辑外键。

6.设置字段默认值,比如:状态、创建时间等。

7.每个字段写清楚注释。

8.表必备三字段:id, gmt_create, gmt_modified。其中 id必为主键,类型为 unsigned bigint、单表时自增、步长为 1. gmt_create,gmt_modified的类型均为 date_time类型。

9.注意字段的约束,比如:非空、唯一、主键等。

10.字段唯一约束的话,该表有逻辑删除,那需要注意逻辑删除的唯一字段。


分页插件的原理:
首先分页参数放到ThreadLocal中,拦截执行的sql,根据数据库类型添加对应的分页语句重写sql,例如:(select * from table where a) 转换为 (select count(*) from table where a)和(select * from table where a limit ,)
计算出了total总条数、pageNum当前第几页、pageSize每页大小和当前页的数据,是否为首页,是否为尾页,总页数等。


树型表查询

课程分类表是一个树型结构,其中parentid字段为父结点ID,它是树型结构的标志字段。
如果树的层级固定可以使用表的自链接去查询,比如:我们只查询两级课程分类,可以用下边的SQL

select
       one.id            one_id,
       one.name          one_name,
       one.parentid      one_parentid,
       one.orderby       one_orderby,
       one.label         one_label,
       two.id            two_id,
       two.name          two_name,
       two.parentid      two_parentid,
       two.orderby       two_orderby,
       two.label         two_label
   from course_category one
            inner join course_category two on one.id = two.parentid
   where one.parentid = 1
     and one.is_show = 1
     and two.is_show = 1
   order by one.orderby,
            two.orderby

如果树的层级不确定,此时可以使用MySQL递归实现,使用with语法,如下:

    WITH [RECURSIVE]
        cte_name [(col_name [, col_name] ...)] AS (subquery)
        [, cte_name [(col_name [, col_name] ...)] AS (subquery)] ...

cte_name :公共表达式的名称,可以理解为表名,用来表示as后面跟着的子查询
col_name :公共表达式包含的列名,可以写也可以不写
下边是一个递归的简单例子:

with RECURSIVE t1  AS
(
  SELECT 1 as n
  UNION ALL
  SELECT n + 1 FROM t1 WHERE n < 5
)
SELECT * FROM t1;

with recursive t1 as (
select * from  course_category p where  id= '1'
union all
 select t.* from course_category t inner join t1 on t1.id = t.parentid
)
select *  from t1 order by t1.id, t1.orderby

mysql为了避免无限递归默认递归次数为1000,可以通过设置cte_max_recursion_depth参数增加递归深度,还可以通过max_execution_time限制执行时间,超过此时间也会终止递归操作。
mysql递归相当于在存储过程中执行若干次sql语句,java程序仅与数据库建立一次链接执行递归操作,所以只要控制好递归深度,控制好数据量性能就没有问题。
思考:如果java程序在递归操作中连接数据库去查询数据组装数据,这个性能高吗?


5.SpringBoot接口开发的常用注解有那些?

@Controller标记此类是一个控制器,可以返回视图解析器指定的html页面,通过@ResponseBody可以将结果返回json,xml数据。

@RestController相当于@ResponseBody加@Controller,实现rest接口开发,返回json数据,不能返回html页面。

@RequestMapper定义接口地址,可以标记在类上也可以标记在方法上,支持http的post,put等方法。

@PostMapper定义post接口,只能标记在方法上,用户添加记录,复杂条件的查询接口。其他同理

@RequestBody定义在方法上,用于将json串装成java对象。

@PathVarible接收请求路径中占位符的值。

@ApiOperation swagger注解,对接口方法进行说明。

@Api swagger注解,对接口类进行说明。

@Autowired 基于类型注入。

@Resource 基于名称注入,如果基于名称注入失败转为基于类型注入。


6.项目的开发流程是什么?

1.产品人员设计产品原型。

2.讨论需求

3.分模块设计接口

4.出接口文档

5.将接口文档给到前端人员,前后端分离开发

6.开发完毕进行测试

7.测试完毕发布项目,由运维人员进行部署安装。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值