记录最近一场面试(Srping、SQL)
一、请写出使用JDBC连接数据库的流程或示例。
答:使用JDBC连接数据库的流程:(贾琏欲执事)
(1)加载注册驱动
(2)获取数据库有连接对象
(3)获取预编译语句对象
(4)执行SQL语句
(5)释放资源
二、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前还是后
在实际运行中,return后面的finally{}会被执行
而且是在return之前被执行
特别的,虽然在finally中有给a赋值,但是a的值并不会改变,为什么呢?
六、Java中的异常有哪几类,怎么处理?
1、分类:
Throwable包含Error和Exception;Exception又分为运行时异常和编译时异常。
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 创建过程
十二、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
)
注: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
注:先按名字分组,然后再统计分数。
(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 = '一技能'
)
注:先在course表中查到Cno课程号,然后通过sc表由Cno过滤得到Sno,再由Sno在student表中得到结果。
(6)查询选修课程超过3门的学生姓名
(7)查询既选修课程号为“002”,又选修课程号为“004”的学生姓名
附录:
本文地址:https://blog.csdn.net/weixin_45764765/article/details/109898309
上一篇: java语法---异常类和泛型
下一篇: 使用Python发送邮件