1、加载JDBC驱动类
2、创建数据库的连接Connection
3、获得预处理语句PreparedStatement (多条记录时PreparedStatement语句编译一次,执行多次,而Statement编译多次,执行多次)
4、执行SQL语句
5、返回结果集
6、 关闭资源
2. 实例化对象的方法除了new还有哪些工厂模式、反射、克隆、反序列化(Java序列化就是指把Java对象转换为字节序列的过程)
3. HashTable与HashMap的区别a. HashTable线程安全,HashMap线程不安全
b. 父类不同,HashTable继承自Dictory类,HashMap继承自AbstractMap类
c. HashTable不允许为null,HashMap允许存在nullkey和null值,但因为key不能重复,所以只能有一个key为null
4. Java8新特性1.lambda表达式,函数式接口
2.foreach循环
3.接口中新增了静态方法和默认方法,都有方法体
4.stream流:filter,map,limit,distinct,sorted,foreach
5.时间日期API:
java.time.LocalDate 表示日期
LocalTime 表示时间
LocalDateTime 表示日期+时间
5. StringBuilder和StringBufferStringBuilder线程不安全,性能高
StringBuffer线程安全,性能不高
JavaWeb 1. session和cookie的区别1.cookie数据存放于浏览器上,session存在服务器上
2.存放存放在本地所以不是很安全,别人可能分析你本地的cookie,进行欺诈,session更安全一些
3.session较多会影响系统性能
4.单个cookie保存的数据不能超过4k,很多浏览器限制一个站点最多保存20个cookie
5.session默认建立在cookie的基础之上,如果客户端不支持cookie,通过url重写实现
2. post和get的区别1.post将请求参数放在请求的正文部分,get是放在请求行,url后面,以问号隔开,用&分割参数
2.post方式参数长度没限制,get方式有限制
3.post方式参数地址栏不可见,相对安全,get方式可见
4.rest风格(Representational State Transfer) 表现层状态转移->URL定位资源,用HTTP动词(GET,POST,DELETe,DETC)描述操作
REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口):
增:@PostMapping
删:@DeleteMapping
改:@PutMapping
查:@GetMapping
3. 同源策略两个页面的协议、域名和端口都一样,则是同源,可以隔离潜在恶意文件
多线程 1. sleep和wait的区别1.sleep属于Thread类,wait属于Object
2.sleep可以在任何位置使用,而wait,notify等需要在同步方法或同步代码块中使用
3.sleep没有释放锁,它只释放了时间片,wait释放了锁
4.sleep需要捕获异常,wait不需要
2. AQS相关问题1.AQS是一个抽象类AbstractQueuedSynchroned,抽象同步队列,可以解决数据安全问题
2.造成数据安全问题的原因
a.可见性
JMM(Java Memory Model)java内存模型,使用volatile、synchronized、Lock、CountDownLatch可以解决
CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到 达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务。
每个线程都有自己的工作内存,彼此隔离,当线程需要操作主内存中的数据时,就从主内存中将数据加载到本线程的工作内存中,对数据操作完成后,再把结果 保存到主内存中,这样就做到了各线程间的数据隔离,当多个线程同一时间把主内存中的同一数据进行加载到各自工作内存进行操作的时候就会引起数据安全问 题。
b.有序性
程序在jvm中运行时可能会发生指令优化导致重排序,volatile、synchronized、Lock都可以阻止重排序。
// 比如 int a; a = 1; a = 2; 本来a最终值为2, 若是发生重排序3、4行重排序,则会导致a最终值为1,
c.原子性
保证一段代码要么都执行要么都不执行,使用AtomicInteger、synchronized、Lock
3. Locknew ReentrantLock().lock 将并发的操作转换为串行,Lock中解决数据安全问题的本质其实就是:将并行或者并发的操作变为了串行的操作
并发:多个事件同时发生
并行:多个事件间隔发生,cpu时间片的轮转
Lock中有哪些功能来保证串行的操作?lock()方法:
1.锁具有独占性,或者叫排他性
2.可以存储没有抢占到锁的线程对象
3.并且阻塞没有抢占到锁的线程对象
unlock()方法:
1.释放锁
2.唤醒阻塞的线程
private static volatile Integer count = 0;
private static Lock lock = new ReentrantLock();
private static void incr() {
lock.lock();
try {
Thread.sleep(10);
count++;
// 可重入锁,不会造成死锁,因为两个锁锁的是用一个对象,synchronized也是可重入锁
desc();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
private static void desc() {
lock.lock();
try {
Thread.sleep(10);
count--;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1000);
for (int i = 0; i < 1000; i++) {
new Thread(() -> {
incr();
latch.countDown();
}).start();
}
latch.await();
System.out.println("count: " + count );
}
4. CAS&ABA
CAS&ABA
5. 公平锁&非公平锁公平锁与非公平锁
6. 乐观锁&悲观锁乐观锁&悲观锁
数据库 1. 事务的隔离级别1.未提交读:导致脏读,即事务A读取了事务B的数据,此时B回滚,A读取的数据就是脏数据
2.已提交读(oracle默认级别):导致不可重复读,即事务A多次读取事务B的数据,但读取过程中更新了,导致A读取的数据前后不一致
3.可重复读(mysql默认级别):导致幻读,系统管理员A将表中的分数改为abcd等级,在改的过程中b又插入一条分数数据,A操作结束后发现还有一条数据没改过来,就像幻觉一样
4.序列化
2. 事务的基本要素(ACID)1.原子性:事务中的所有操作要么都成功,要么都失败,不会停留在中间环节,所有操作是一个整体,共进退
2.一致性:事务开始前和结束后,数据的完整性,A转账给B,不可能A扣了钱,B没收到
3.隔离性:同一时间,只允许一个事务处理同一条数据,不能A取钱的同时,B却向这张卡转了账
4.持久性:事务完成后事务对数据库的所有更新都将保存到数据库,既然事务完成了就不能再回滚了
3. mysql多表查询可以通过子查询和表连接进行多表查询,
表连接分为内连和外联,
内连会返回两张表都符合条件的数据,null不会显示出来
外联会返回基准表的所有数据和另一张表符合条件的数据,没有会用null补全
例如左外联就是以左表为基准表
4. 分页查询limit offset,size 例如:limit 3,3 从第四条开始取3条记录
5. 懒加载懒加载就是延迟加载,当真正需要所需数据的时候才进行加载,而不是一开始就加载所有数据,懒加载跟缓存不是一回事
例如:
1.前端页面的懒加载,整个页面很大,较下方的页面还不在窗口中显示时就不需要加载进来,可以只是先加载同样的空白图片,而图片出现在窗口中时才加载
2.公司部门的结构查询,有很多部门,若是一次加载所有部门的结合信息显然不合理,所以当选定某个部门时才加载进来此部门的数据是更合理的选择
6. 创建索引 1.创建索引:create index 索引名 on 表名(索引字段) 或者
create table test( a int , b int, c int, d int, key index_abc(a,b,c) )engine=InnoDB default charset=utf8;2.联合索引:最左匹配原则
类似于这种索引匹配规则,可以先看懂b+树的数据结构,这种很好理解。 因为在B+树种,联合索引(a,b,c) 是从左到右的。 此时,如果where b and c 这时 没有a,那么在B+树种无法找到第一个索引,所以无法走索引。 同理,如果where a and c 那么可以找到a开头的索引,所以可以走索引。
3.查看索引匹配情况 explain select * from test where b<10 and a <10;
7. 存储引擎MyISAM和InnoDB的区别InnoDB支持事务、外键、行锁;
MyISAM支持全文索引(select * from test where match(content) against('aaaa');)
清空整个表时,InnoDB是一行一行数据的删除,MyISAM是重新建表
8. 索引是什么索引就是对一个或多个列值的排序,帮助数据库高效或者数据库的数据结构
9. 索引类型1.普通索引
2.唯一索引
3.主键索引
4.全文索引,只能在MyISAM存储引擎以及char、varchar、text类型的字段上使用全文索引
10. 索引的缺点增删改速度下降,因为每次增删改都要重建索引,而且占用空间
11. sql优化sql优化
12.mysql中的锁MyISAM支持表锁,InnoDB支持表锁和行锁,默认行锁
表锁:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概率较高,并发量低
行锁:开销大,加锁快,可能出现死锁,粒度小,所属锁冲突的概率较低,并发量高
Mybatis 1. $与#在mybatis中的区别#是使用占位符,就是使用PreparedStatement预处理语句;
$是字符串拼接,就是使用Statement处理语句,容易导致sql注入
2. association与collection:
association:一对一,多对一
collection:一对多
3. log4j2日志级别all trace debug info warn error fatal off
4. 实体类中的属性名和表中的字段名不一样,怎么办1.使用别名
2.使用resultmap进行映射
5. xml文件与mapper接口的映射,工作原理是什么?Dao里面的方法可以重载吗?原理是jdk动态代理为mapper接口生成代理类。
不可以重载,因为寻找策略是完全限定名+方法名
namespace对应类,id对应方法,parameterType对应形参,resultType对应返回体
6. 在mapper中如何传递多个参数包装类
多个参数封装成map集合
使用@param绑定参数
7. Mybatis的一级二级缓存一级缓存是SqlSession级别的缓存(默认);
二级缓存是mapper级别的缓存;
当此级别的缓存执行cud操作时,默认该作用域下的select中的缓存将被清空
8. mybatis是否支持延迟加载?如果支持,实现原理是什么?Mybatis仅支持association和collection关联对象的延迟加载;
原理是使用cglib创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,拦截器方法如果发现a.getB().getName()中B为null,只会去执行sql语句,加载B对象信息,这就是延迟加载,真正用到的时候才加载
Spring 1. AOP面向切面编程增加一些统一的功能,比如日志,权限
原理:1.基于接口的jdk动态代理 2.基于子类的cglib动态代理
2. IOC控制反转依赖注入,控制反转,将对象的创建交给apring容器,降低层与层直接的耦合度
3. Spring bean的作用域prototype 原型,每次都会得到一个新的实例
singleten(默认) 单例,每次得到的都是同一个实例
request 每次请求创建一个实例,请求完成之后会被回收
session 每个session都有一个bean,session过期,bean失效
application 程序运行时bean就会一直生效
4. Spring常用注解@Controller @Service @Repository @RequestMapping @RequestParam @RequestBody @ResponseBody @AutoWired @Scope @Transactional
5. Spring依赖注入方式1.setter方法设值注入
2.构造器注入
3.接口注入,实现特定方法进行注入
6. BeanFactory和ApplicationContext区别它们俩都是spring的核心接口,ApplicationContext是BeanFactory的子接口,
BeanFactory采用延迟加载注入bean,用到时才会加载具体bean
ApplicationContext是在容器启动时,一次性创建所有bean
7. Spring的自动装配1.byName @Resource @Qualifier 按名称进行自动装配,其中@Resource名称不匹配会根据类型查找,使用setter方法按名称注入
2.byType @AutoWired 按类型自动装配,也是使用setter方法按形参类型注入
3.constructor 自动匹配构造器的参数
4.autodetect spring容器根据bean的内部结果,自行决定使用构造器或者setter方法注入
8. Spring事务的种类1.变成式事务 2.声明式事务,入@Transactional
9. Spring的事务传播行为1.PROPAGATION_REQUIRED:有事务则加入,没有事务则新建,这是最常用的设置
2.PROPAGATION_SUPPORTS:有事务则加入,没有事务就以非事务执行
3.PROPAGATION_MANDATORY:有事务就加入,没有事务就抛出异常
4.PROPAGATION_REQUITED_NEW:无论当前有没有事务,都新建
5.PROPAGATION_NOT_SUPPORTED:以非事务方式执行,有事务就挂起
6.PROPAGATION_NEVER:以非事务方式执行,有事务就跑异常
7.PROPAGATION_NESTED:有事务就新建一个内嵌事务,没有则新建
SpringMVC 1. SpringMVC的流程用户请求发送到前端控制器DispatcherServlet,DispatcherServlet调用处理器映射器HandlerMapping,根据url返回具体的handler,DispatcherServlet调用
处理器适配器HandleAdapter,HandleAdapter调用handler生成ModelAndView返回给DispatcherServlet,DispatcherServlet调用视图解析器ViewResolver处理ModelAndView返回具体的view,然后DispatcherServlet对view进行渲染,最后响应用户
2. @RestController@RestController相当于@Controller+@ResponseBody
Redisredis面试题
RabbitMQrabbitmq



