JAVA常见问题

1、开发一个数据库的流程是怎样的?
数据库设计阶段
数据库操作阶段
数据库优化阶段
2、怎么建库,建表?
建库:create database [if not exists ]数据库名;
建表:create table 表名(
字段1 字段1类型 [约束] [comment 字段1注释],
字段2 字段2类型 [约束] [comment 字段2注释],
字段3 字段3类型 [约束] [comment 字段3注释],

字段n 字段n类型 [约束] [comment 字段n注释]
)[comment 表注释];

3、约束有哪些,什么含义?
NOT NULL :非空约束——不能为空
UNIQUE :唯一约束——保证该字段数据都是唯一的、不重复的
PRIMARY KEY :主键约束——主键是一行数据的唯一标识,要求非空且唯一
DEFAULT :默认约束——保存数据时,未指定该字段的值,则采用默认值
FOREIGN KEY :外键约束——用来让两张表的数据之间建立连接,保证数据的一致性和完整性

4、操作数据insert into, update, delete
给指定字段添加数据:
insert into 表名(字段名1,字段名2,…)values(值1,值2,…);

修改数据:
update 表名 set 字段名1 = 值1,字段名2 = 值2 , …[where 条件];

删除数据:
delete from 表名 [where 条件];

5、SpringBoot中用过哪些注解,有什么作用?

6、后端开发中三层架构是哪些,各自负责什么?
Controller:负责接收、响应前端数据
Service :负责业务逻辑的处理
Dao :负责数据的增删改查

7、前端和后端传参有哪些形式
简单参数
实体参数
数组集合参数
日期参数
JSON参数
路径参数

8、IOC,DI
IOC是一种设计思想
IOC和DI的关系并不是一个类似于接口和实现类的区别,IOC是一种设计思想,DI是IOC的一种实现,DI也称为“依赖注入”

IOC:控制反转
控制:指的是管理对象的权力
反转:指的是由Spring管理而不是开发者管理
IOC的目的是为了解耦合,当将一个对象交给第三方容器管理后,对象之间的耦合相较于传统new的方式会降低。同时
Spring IOC也可以降低对象的管理成本,比如实现单例模式(默认是单例)等等
DI:

依赖注入不能单独存在,需要在ioc的基础上完成操作。也就是说,只有把对象创建了,你才能向类里面注入值。
9、控制反转用哪些注解实现,DI用什么注解实现。

10、Vue是什么,ElementUI什么、Nginx是什么
11、三剑客?
12、CSS 选择器有哪些

[day08 DQL,多表设计]

​ 1、DQL是什么?
​ 2、查询语句的完整格式是怎样的?
​ 3、条件查询的关键字是什么,常见的运算符有哪些?
​ 4、如何实现模糊查询?
​ 5、怎么实现排序查询?
​ 6、怎么实现分页查询?
​ 7、分页查询中怎么计算某一页开始索引?
​ 8、怎么实现分组查询,分组查询的目的是什么?
​ 9、聚合函数有哪些?
​ 10、怎么实现给查询的值设定新的数据:比例 1变成男,2变成女
​ 11、表和表之间有哪些关系?
​ 12、不同关系怎么设计外键
​ 13、什么是物理外键,什么是逻辑外键

14、SQL的执行原理是怎样的?
	在 SQL 中,SELECT 语句的执行顺序是:
	FROM 子句:从数据源中选择需要查询的表和视图。
	WHERE 子句:对查询结果进行过滤,只返回符合条件的行。
	GROUP BY 子句:对查询结果进行分组,按照指定的列进行分组。
	HAVING 子句:对分组结果进行过滤,只返回符合条件的分组。
	SELECT 子句:选择需要返回的列,以及对列进行计算。
	ORDER BY 子句:对查询结果进行排序,按照指定的列进行排序。
	LIMIT 子句:限制查询结果的数量,只返回指定数量的行。
	在执行 SELECT 语句时,会先执行 FROM 子句,从数据源中选择需要查询的表和视图。然后,如果 WHERE 子句存在,会对查询结果进行过滤,只返回符合条件的行。接着,如果 GROUP BY 子句存在,会对查询结果进行分组,按照指定的列进行分组。如果 HAVING 子句存在,会对分组结果进行过滤,只返回符合条件的分组。然后,会执行 SELECT 子句,选择需要返回的列,以及对列进行计算。最后,如果 ORDER BY 子句存在,会对查询结果进行排序,按照指定的列进行排序。如果 LIMIT 子句存在,会限制查询结果的数量,只返回指定数量的行。SELECT 语句的执行原理是基于关系型数据库的查询语言,它可以处理大量的数据,并且可以进行复杂的数据处理和分析。在执行 SELECT 语句时,数据库会读取数据源中的数据,对数据进行过滤、分组、排序和计算,最后返回结果

[ day09 MySQL + Mybatis ]

​ 【多表查询】
​ 1、什么叫做笛卡尔积?笛卡尔积后所有结果都是有效的么?怎么去除无效数据?
​ 2、多表查询有几种方式?各自什么含义?
​ 【事务】
​ 3、事务是什么?举例说明
​ 4、MySQL默认事务是怎么提交的?
​ 5、如何自己开启事务,提交事务,回滚事务?
​ 6、事务的四大特性是什么含义?
​ 【MyBatis】
​ 7、MyBatis是什么,作用是什么?
​ 8、如果要创建一个SpringBoot项目要处理数据库数据需要哪些依赖?
​ 9、简要描述我们如何创建一个SpringBoot项目支持MyBatis操作?

[day10 Mybatis基础操作]

  1. 使用注解定义增删改查,分别用什么注解实现?
  2. 被@Select,@Update,@Delete,@Insert 注解的方法,要放在哪里?
  3. 在新增数据时,如果想要让id回存到对象中怎么办?
  4. 如果表中的字段名称和POJO中属性名称不一样,怎么去实现数据的映射?
  5. #{} 和 ${} 的区别是什么?
  6. 什么是SQL注入?
  7. 接口中的方法怎么设定参数,好让SQL语句中能够识别。
  8. 动态SQL中有哪些标签,各有什么作用: where-if set-if foreach sql include

[day11 SpringBoot案例]

-------------程序:数据加算法-----------------

1.什么是RESTful风格的后端接口?
RESTful:是一种风格,是基于传统URL进行优化的一种软件架构风格,通过四种请求方式实现对数据的增删改查。
四种请求方式:GET-查询 POST-增加 PUT-修改 DELETE-删除
使用REST风格去定义URL会比传统得更加简洁、更加规范、更加优雅。

2.开发一个功能需要经历哪些流程?
1、查看页面原型明确需求
2、阅读接口问文档
3、思路分析
4、接口开发
5、接口测试
6、前后端联调

3.开发分页功能前端至少需要传什么参数过来,后台简化分页开发的插件叫什么?怎么用?
1、当前页码和每页展示记录数
分页插件PageHelper
需要在Service层,调用Mapper的方法之前设置分页参数,在调用Mapper方法执行查询之后,解析分页结果,并将结果封装到对象PageBean中,返回

4.部门新增逻辑?
当Controller层接收请求参数,然后调用Service层,在Service层补充默认参数(添加时间、最后修改时间),在调用Mapper层,Mapper执行对数据库新增的SQL语句

5.部门删除逻辑?
Controller层接收请求参数id,调用service删除部门,Service调用mapper层执行删除操作,Mapper层对数据库执行删除的SQL语句

6.部门查询逻辑?
Controller层接收请求,调用service查询部门,Service调用mapper层执行查询操作,Mapper层对数据库执行查询的SQL语句

7.员工查询逻辑?怎么实现分页查询的?
Controller层接收参数page、pageSize、name、gender、begin、end,调用Service层进行分页条件查询,使用PageHelper完成分页条件查询,调用Mapper层使用动态SQL实现,Service层封装PageBean对象返回给Controller,Controller层获取PageBean,然后响应。

8.员工删除怎么实现?
Controller层接收路径请求参数id数组,调用Service层进行批量删除操作,Service层调用Mapper层进行批量删除操作,Mapper层使用动态SQL实现批量删除员工

[day12 SpringBoot案例2]

1、用什么注解可以快速获取日志对象?
@SLF4J

2.、文件上传前端表单必须具备哪三个要素?
-表单必须有 file 域,用于选择要上传的文件。
-表单提交方式必须为 POST。
-表单的编码类型enctype必须要设置为 multipart/form-data。

3、文件上传功能开发时,后台用什么类型的参数来接收文件?
文件上传功能开发,使用MultipartFile类型的参数来接收文件,MultipartFile是Spring框架提供的接口,他封装了上传文件的内容
和相关信息,可以通过接口的方法来获取文件的名称、大小、内容
MultipartFile 常见方法:
getOriginalFilename(): 获取原始文件名
getContentType(): 获取文件的类型
getInputStream(): 获取文件的输入流
transferTo(File dest): 将上传的文件保存到目标文件中(Mac中测试有问题,可以使用流获取数据拷贝方式)
getBytes():获取文件的字节数组

4、请说说你的图片存储方案是怎样的?
保存在本地磁盘
保存在阿里云的OSS
5、请说说你的员工修改是怎么实现的?
在controller层接收到前端的请求和修改员工的JSON对象并转换为pojo对象,调用Service层,在Service的实现层更新修改时间 UpDatetTima,调用Mapper层,在Mapper层使用xml的方式进行修改,然后返回结果给前端。

day13 SpringBoot案例3登录校验]

1.登录校验的实现思路是怎样的?
项目中访问核心资源,通常都要进行登录校验,访问京东商城的订单,必须要先登录才能访问查询。
实现思路:可以在访问资源前进行访问的拦截,判断你当前会话是否有登录,如果没有登录拒绝访问。如果是登录的那就可以进行访问资源。
2.会话技术有哪些方式可以实现?
传统技术可以使用Cookie+Session去实现会话,进行会话跟踪。但是这种传统方式有弊端:不能在集群服务中灵活使用,手机客户端无法支持Cookie。
为了解决这些问题,可以使用令牌技术来解决。令牌技术优点是:可以在集群服务中灵活使用,移动端也可以支持。

服务端会话跟踪技术:Session

3. JWT令牌组成部分有哪些,各自作用是什么?
三部分组成:

header.payload.signature

header.payload.signature 部分的数据会以Base64的方式进行编译。
这三部分的作用分别是:
header:指定令牌类型,加密的算法…
payload:存储一些令牌要携带的信息,比如用户的基本信息id,username, 过期时间
signature :保证令牌不被篡改。

4.怎么使用JWT令牌?(依赖,创建,校验)
1、加入依赖

io.jsonwebtoken
jjwt
0.9.1

2、创建令牌
String jwt = Jwts.builder()
.addClaims(携带的数据,是一个map集合)
.signWith(SignatureAlgorithm.HS256, 秘钥)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
3、解析令牌
Claims claims = Jwts.parser()
.setSigningKey(秘钥)//要和创建令牌时的秘钥保持一致
.parseClaimsJws(令牌)//要解析的令牌
.getBody();
当解析不报异常,此时就代表令牌是有效的。报任何异常都意味着令牌失效。

5.项目中在什么时候去生成令牌?
在登录时生成令牌,在访问核心资源时进行令牌的校验

6.当前端携带令牌访问资源时怎么去拦截校验令牌的合法性?
有两种方式可以实现:
1、过滤器
2、拦截器

7. 过滤器具体使用的步骤是怎样的?
Filter使用步骤如下:
1、创建一个类实现接口Filter接口,重写doFilter方法
2、类上面需要加注解:@WebFilter(urlPatterns = “/*”)
3、在引导类中注解:@ServletComponentScan
4、要做具体的拦截业务在doFilter中完成
public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain chain) {

//登录校验拦截
	xxxxxx
//放行(如果不放行,就不执行如下语句)
chain.doFilter(req,rsp);
 yyyyyyy

}

8. 拦截器具体使用的步骤是怎样的?
Interceptor使用步骤如下:
1、创建一个类实现HandlerInterceptor接口,上面加上注解@Component
public class LoginCheckInterceptor implements HandlerInterceptor
2、重写方法方法
preHandler 方法可以实现在资源访问前的拦截

3、写配置类,在里面进行注册:
3.1 写一个类叫做配置,实现接口WebMvcConfigurer,并在类型上加上注解:@Configuration
@Configuration
public class WebConfig implements WebMvcConfigurer

3.2 注入拦截器对象,重写方法addInterceptors 进行注册,并设定拦截路径。
  @Configuration
  public class WebConfig implements WebMvcConfigurer {

      @Autowired
      private LoginCheckInterceptor loginCheckInterceptor;

      @Override
      public void addInterceptors(InterceptorRegistry registry) {
          //注册拦截器
          registry.addInterceptor(loginCheckInterceptor)
                  .addPathPatterns("/**");
      }
  }

9.项目中异常是怎么处理的?具体怎么实现?
异常处理有两种方式:
1、在每一个Controller中的方法里面单独try-catch捕获异常(代码繁琐)
2、全局异常处理(推荐的方案)

全局异常处理的实现步骤:
异常处理有两种方案:
1、在每一个Controller中的方法里面单独try-catch捕获处理(代码冗余,繁琐)
2、全局异常处理(推荐的方案)

全局异常处理的实现步骤:
1、创建一个类用来专门处理异常,在类上面加上注解:@RestControllerAdvice
2、在里面写一个方法用来处理异常:该方法返回值类型用同一响应结果Result,还需要使用注解@ExceptionHandler 去定义要处理的异常类型。

@RestControllerAdvice
@Slf4j //配置日志对象
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result ex(Exception e) {
log.error(“全局异常处理”, e);
return Result.error(“系统繁忙,请稍后重试!!”);
}

}

【day14 SpringBoot 事务管理+AOP】

1、 事务是什么?在MySQL中是怎么去开启,提交,回滚事务的。
事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要忙同时成功要忙同时失败

通过
开启事务:begin / start transaction
提交事务:commit : 全部成功后提交事务
回滚事务: rollback: 中间有任何一个子操作出现问题,回滚事务

2、在Spring中怎么管理事务,用什么注解,在那个层次进行使用可以有效管理事务
使用 @Transaction注解,在Service层使用可以有效对事务进行管理

3、事务管理时规则:如果方法能够正常执行完自动提交事务,如果出现异常自动回滚事物。事务默认识别的异常是运行时异常,如果想要识别到编译时异常从而实现回滚,该怎么操作?
使事务可以识别到编译时异常有两种方案
方案一:抛出异常 在@Transactional 设置 (rollbackFor = Exception.class)
这样配置的话,在使用时会比较麻烦
方案二:将编译时异常转换为运行时异常,然后在抛出
这样是使用既方便,又不至于事务失效,

4、事务的传播方式有哪些,含义是怎样?
required 默认值 , 需要事务,有责加入,无则创建新事务
required-new 需要新事物,无论有无,总是创建新事物
supports 支持事务,有则加入,无则在独立的连接中运行SQL
not_supported 不支持事务,不加入,在独立的连接中运行SQL
mandatory 必须有事务,否则抛出异常
never 必须没事务,否则抛出异常
nested 嵌套事务

5、 AOP叫做什么,有什么作用?举一个5岁孩子就能理解的例子?
AOP(面向切面编程)是一种编程范式,可以帮助我们更好的组织和管理代码,
假设你是一个小朋友,每天按照爸妈的要求完成一些任务,例如刷牙、洗脸、穿衣服等, 爸妈给你制定了一个任务清单,上面列出了每天要做的事情
现在你想在完成每个任务的时候,额外做一些事情,比如在刷牙的时候,想要玩手机
这时候AOP就可以帮助你实现这个需求。他可以将你的额外行为 与 每个任务分离开来,使得你可以在不修改任务清单的情况下,添加额外的行为
AOP就像一个额外的魔法手套,可以帮助你在完成任务的同时,做一些额外的事情,而不需要改变任务本身

6、如果要完成一个AOP的入门案例,需要有哪些步骤?
1)在pom.xml引入依赖
2)定义类抽取公共代码
3)标识当前类是一个AOP,并被Spring容器管理
4)配置公共代码作用于那些目标方法
5)执行目标方法
6)测试运行
7、AOP的概念理解:连接点,通知,切入点,切面 ?
连接点: JoinPoint,可以被AOP控制的方法执行(包含方法信息)
通知: Advice,重复逻辑代码
切入点: PointCut,匹配连接点的条件
切面: Aspect,通知+切点

8、通知有哪些类型?
@Around:此注解标注的通知方法在目标方法前、后都执行
@Before:此注解标注的通知方法在目标方法被执行前执行
@After:此注解标注的通知方法在目标方法后被执行,无论是否有异常
@AfterReturning:此注解标注的通知方法在目标方法后被执行,有异常不会执行
@AfterThrowing:此注解标注的通知方法发生异常后执行

@Around 需要自己调用ProceedingJoinPoint.proceed()来让目标方法执行,其他通知不需要考虑目标方法执行

9、 如果有不同切面的通知,增强相同的方法,执行顺序是怎样的?
默认按照bean的名称字母排序
用@Order(数字)加在切面类上来控制顺序
目标前的通知方法:数字小先执行
目标后的通知方法:数字小后执行

10、切点表达式有几种,具体怎么定义?
execution(返回值类型 包名.类名.方法名(参数类型))
可以通配任意返回值类型、包名、类名、方法名、或任意类型的一个参数
… 可以通配任意层级的包、或任意类型、任意个数的参数
@annotation() 根据注解匹配
args() 根据方法参数匹配

一:
execution 主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配
execution(访问修饰符? 返回值 包名.类名?.方法名(方法参数)throws 异常?)

其中带 ? 的表示可以省略的部分
访问修饰符:可省略(没啥用,仅能匹配 public、protected、包级,private 不能增强)
包名.类名: 可省略
throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)

二:
切点表达式也支持匹配目标方法是否有注解。使用 @annotation
@annotation(com.itheima.anno.Log)

三:
通过@PointCut注解,可以抽取一个切入点表达式,然后再其他的地方我们就可以通过类似于 方法调用 的形式来引用该切入点表达式。

    @Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
    public void pt(){}

    @Around("pt()")
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long begin = System.currentTimeMillis();
        //调用原始操作
        Object result = joinPoint.proceed();
        long end = System.currentTimeMillis();
        log.info("执行耗时 : {} ms", (end-begin));
        return result;
    }

11、如果有多个通知的切点表达式一样,怎么抽取?
通过@PointCut注解,可以抽取一个切入点表达式,然后再其他的地方我们就可以通过类似于 方法调用 的形式来引用该切入点表达式。

12、连接点是什么可以获取哪些信息?
连接点简单理解就是 目标方法 , 在Sping中用JoinPoint抽象了连接点,用它可以获得执行方法时的相关信息,如方法名、方法参数类型、方法实际参数
对于@Around通知,获取连接点信息只能使用ProceedingJoinPoint
对于其他四种通知,获取连接点信息只能使用JoinPoint,它是ProceedingJoinPoint的父类型

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值