欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

记录最近一场面试(Srping、SQL)

程序员文章站 2022-06-26 16:22:40
一、请写出使用JDBC连接数据库的流程或示例。二、Collection和Collections的区别?三、Java中IO流按功能和类型各分几种?他们之间有什么区别?四、线程和进程的区别?五、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后六、Java中的异常有哪几类,怎么处理?七、Mybatis #{}和 ${}的区别是什么?八、se......

一、请写出使用JDBC连接数据库的流程或示例。

答:使用JDBC连接数据库的流程:(贾琏欲执事)

(1)加载注册驱动

(2)获取数据库有连接对象

(3)获取预编译语句对象

(4)执行SQL语句

(5)释放资源

记录最近一场面试(Srping、SQL)

二、Collection和Collections的区别?

答:Collection是一个接口,Collections是一个类。

java.util.Collection是集合类的最上层的接口,主要为各种集体的集合提供统一的操作方式,它在Java中有很多具体的实现:

 Collection   
├List   
│├LinkedList   
│├ArrayList   
│└Vector   
│ └Stack   
└Set

https://blog.csdn.net/weixin_45764765/article/details/105134807

Collections是集合的一个工具类,提供了排序、搜索和线程安全操作。

 

三、Java中IO流按功能和类型各分几种?他们之间有什么区别?

 

四、线程和进程的区别?

答:进程是程序的一次执行过程,是系统运行程序的基本单位。而线程是比进程更小的执行单位。一个进程在执行的过程中可以产生多个线程。

各进程基本上的独立的,而各线程则不一定,同一个进程中的线程有可能会相互影响。 

——————————————————

1、程序,是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
 
2、进程,是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。
简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,文件,输入输出设备的使用权等等。
换句话说,当程序在执行时,将会被操作系统载入内存中。
 
3、线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线
程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
 
4、Java 线程是重量级的,每个线程默认使用 1024KB 的内存,所以一个 Java 进程是无法开启大量线程的。
 
5、线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线 程则是在同一程序内几乎同时执行一个以上的程序段。

 

五、try{} 里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后

记录最近一场面试(Srping、SQL)

在实际运行中,return后面的finally{}会被执行

而且是在return之前被执行

特别的,虽然在finally中有给a赋值,但是a的值并不会改变,为什么呢?

 

六、Java中的异常有哪几类,怎么处理?

1、分类:

Throwable包含Error和Exception;Exception又分为运行时异常和编译时异常。

记录最近一场面试(Srping、SQL)

2、如何处理

Error是程序无法处理的。

编译时异常,是程序可以处理的异常,如果抛出异常的方法本身不能处理,就需要调用者去处理,否则编译无法通过。

运行时异常,是无法让程序恢复运行的异常,一般是因为执行了错误的操作,在开发调试的过程中就要去处理好,处理成我们想要的效果。

 

七、Mybatis #{} 和 ${} 的区别是什么?


${} 是 Properties 文件中的变量占位符,它可以用于 XML 标签属性值和 SQL 内部,属于字符串替换。例如将 ${driver} 会被静态替换为 com.mysql.jdbc.Driver

${} 也可以对传递进来的参数原样拼接在 SQL 中,有 SQL 注入的风险。

#{} 是 SQL 的参数占位符,Mybatis 会将 SQL 中的 #{} 替换为 ? 号,在 SQL 执行前会使用 PreparedStatement 的参数设置方法,按序给 SQL 的 ? 号占位符设置参数值,比如 ps.setInt(0, parameterValue) 。

所以,#{} 是预编译处理,可以有效防止 SQL 注入,提高系统安全性。

 

八、session共享和持久化如何实现?

 

九、说说注解是什么,你在什么场景中会用到自定义注解,注解的好处和坏处

 

十、在spring框架中,哪些地方用到了jdk动态代理,哪些地方用到了cglib代理

 

 

十一、请描述一下Springboot bean 创建过程

Spring 上下文中的 Bean 也类似,如下
1 、实例化一个 Bean --也就是我们常说的 new
2 、按照 Spring 上下文对实例化的 Bean 进行配置--也就是 IOC 注入;
3 、如果这个 Bean 已经实现了 BeanNameAware 接口,会调用它实现的 setBeanNa
me(String) 方法,此处传递的就是 Spring 配置文件中 Bean id
4 、如果这个 Bean 已经实现了 BeanFactoryAware 接口,会调用它实现的 setBeanF
actory(setBeanFactory(BeanFactory) 传递的是 Spring 工厂自身(可以用这个方式来
获取其它 Bean ,只需在 Spring 配置文件中配置一个普通的 Bean 就可以);
5 、如果这个 Bean 已经实现了 ApplicationContextAware 接口,会调用 setApplica
tionContext(ApplicationContext) 方法,传入 Spring 上下文(同样这个方式也可以实现
步骤 4 的内容,但比 4 更好,因为 ApplicationContext BeanFactory 的子接口,有更
多的实现方法);
6 、如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用 postProcessBefore
Initialization(Object obj, String s) 方法, BeanPostProcessor 经常被用作是 Bean
内容的更改,并且由于这个是在 Bean 初始化结束时调用那个的方法,也可以被应用于内存
或缓存技术;
7 、如果 Bean Spring 配置文件中配置了 init-method 属性会自动调用其配置的初
始化方法。
8 、如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用 postProcessAfterIn
itialization(Object obj, String s) 方法、;
注:以上工作完成以后就可以应用这个 Bean 了,那这个 Bean 是一个 Singleton 的,
所以一般情况下我们调用同一个 id Bean 会是在内容地址相同的实例,当然在 Spring
配置文件中也可以配置非 Singleton ,这里我们不做赘述。
9 、当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 这个
接口,会调用那个其实现的 destroy() 方法;
10 、最后,如果这个 Bean Spring 配置中配置了 destroy-method 属性,会自动调
用其配置的销毁方法。

 

十二、Springboot项目,如何开启跨域,顺便讲一下,什么是跨域?为什么要开启跨域? 

 

十三、有3个表:Student学生表、Course 课程表、Sc选择表如下

student(学生表):主键为Sno

属性 Sno(学号) Sname(姓名) Ssex(性别) Sage(年龄)
类型 VARCHAR(16) VARCHAR(20) VARCHAR(2) INT

 

 

 

course表:主键Cno

类型 Cno(课程号) Cname(课程名) Ctime(学时) Teacher(教师)
类型 VARCHAR(16) VARCHAR(20) INT VARCHAR(20)

 

 

 

 

sc选课表:

属性 Sno(学号) Cno(课程号) Score(分数)
类型 VARCHAR(16) VARCHAR(16) INT

 

 

 

(1)创建成绩表sc(表名和属性名必须用英文书写)

CREATE TABLE sc (
	Sno VARCHAR(16),
	Cno VARCHAR(16),
	Score INT
)

记录最近一场面试(Srping、SQL)

注:CREATE TABLE table_name (column_name column_type);

用逗号分隔分隔列

(2)查询每个学生的总分

SELECT s.Sname, sum(sc.Score) 

FROM student s LEFT JOIN sc

ON s.Sno = sc.Sno

GROUP BY s.Sname

记录最近一场面试(Srping、SQL)

注:先按名字分组,然后再统计分数。

(3)为学生表中所有年龄在18到24岁的男生创建一个视图。

 

(4)查询选修了课程号为“001”的学生的学号和姓名(用子查询实现)

SELECT Sno, Sname 
FROM student
WHERE Sno IN
(SELECT Sno FROM sc WHERE Cno = "001")

注:使用子查询,先从sc表查询选了课程001的学生学号,再在student表中查询学生姓名。

 

(5)查询选修了课程名称为“一技能”的学生学号和姓名(用连接查询实现)

SELECT s.Sno, s.Sname
FROM student s LEFT JOIN sc
ON s.Sno = sc.Sno
WHERE sc.Cno = (
SELECT Cno FROM course
WHERE Cname = '一技能'
)

记录最近一场面试(Srping、SQL)

注:先在course表中查到Cno课程号,然后通过sc表由Cno过滤得到Sno,再由Sno在student表中得到结果。

(6)查询选修课程超过3门的学生姓名

 

 

(7)查询既选修课程号为“002”,又选修课程号为“004”的学生姓名

 

 

附录:

记录最近一场面试(Srping、SQL)

记录最近一场面试(Srping、SQL)

记录最近一场面试(Srping、SQL)

 

本文地址:https://blog.csdn.net/weixin_45764765/article/details/109898309

相关标签: 面试题 java