1,Mybatis的一级缓存和二级缓存
一级缓存:基于PerpetualCache(永久缓存)的HashMap本地缓存,其储存作用域为Session,当Session flush或close之后,该Session中的所有Cache将清空,默认打开一级缓存
二级缓存:和一级缓存的机制相同,也是使用PerpetualCache,HashMap储存,
不同的是二级缓存的储存作用域是Mapper(Namespace),并且可自定义储存源,
二级缓存不是默认打开的,要开启二级缓存,使用二级缓存属性类实现Serializabe序列化接口,(可用来保存对象状态)可以在它的映射文件中配置
对于缓存数据更新机制,当某个作用域(一级缓存时Session/二级缓存Namespace)进行了CUD操作后,默认该作用域下所以select中的缓存将被clear
2,简述 Mybatis 的插件运行原理,以及如何编写一个 插件
编写插件三个过程
1,编写一个Intercepror接口实现类
2,设置插件的签名,告诉mybatis需要拦截哪个对象的哪个方法
3,最后将插件注册到全局配置文件中
运行原理
mybatis可以编写针对Executor,statementHandler,ParameterHandler,ResultSerHandler四个接口的插件,mybatis使用JDK的动态代理为需要拦截的接口生成代理对象,然后实现接口的拦截方法,所以当需要执行拦截方法的时候,会进入拦截方法(AOP面向切面编程)
3,MyBatis 实现一对一,一对多有几种方式,怎么操 作的
有联合查询和嵌套查询
联合查询:几个表联合查询,然后通过在resultMap里面的association,collection节点配置一对一,一对多的类就可以完成
嵌套查询是:先查询一个表,在根据这个表里面的外键ID,然后去查另一个表里面的数据也可以通过association,collection,但另一个表的查询通过select节点配置
4,什么是反射机制
在运行状态中,能获取一个类的所有属性和方法,任何对象,都能调用它任意一个方法和属性,这种动态获取信息以及动态调取对象的方法称为JAVA反射
静态编译和动态编译
静态编译:编译时确定对象类型,绑定对象
动态编译:运行时确定类型,绑定对象
5,深拷⻉和浅拷⻉区别是什么
最大的区别就是是不是真的获取一个对象的复制实体,而不是引用
分为基本数据类型和引用数据类型
基本数据类型:数据直接储存在栈中
引用数据类型:储存在栈中的只是引用对象的地址,真正的对象储存在堆中
浅拷贝:对于基本数据类型,就是直接复制数据的值,
对于引用数据类型,只复制引用的对象地址,两个地址指向同一个对象,这样修改一个另一个要会修改
深拷贝:对于基本数据类型,直接复制数据的值,
对引用数据类型,就是开辟一个新的内存空间,在新空间里复制一个一模一样的对象,新老对象不共享内存修改其中一个不会影响另外一个
6,并发和并⾏有什么区别?
并发:两个或多个事情在同一时间间隔发生,就是在同一时刻只会做一件事情
并行:两个或多个事件在同一时刻发生,同一时刻做多件事情
7,面向对象和面向过程的区别
面向对象
优点:易维护,易复用,易扩展,有继承,封装,多态的特性,更容易设计出耦合的系统
缺点:性能比面向过程低
面向过程
优点:性能比面向对象高,因为类的调用时需要实例化,开销比较大,比较耗资源,所以当性能是最重要的因素时,可以选择面向过程
缺点:没有易维护,易扩展,易复用
8,final finally finalize 区别
final:可以修饰类,变量,方法,修饰类表示这个类不能被继承,修饰方法表示这个方法不能被重写
修饰变量表示这个变量不能被重新赋值
finally:一般用于try-catch中,一般用于一些需要关闭资源的代码,finally表示不管是否出现异常,finally里面的代码都会执行
finalize:就是垃圾回收器调用这个方法来判断这个对象是否被引用,
9,this 与 super 的区别
1,super()主要是对父类构造函数的调用,this()是对重载构造函数的调用
2,super()主要是在继承了父类的子类的构造函数的使用,在不同的类中使用,this()主要是在同一个类中不同的构造函数使用
相同点:
super()和this()都需要在构造函数的第一行进行使用,不然会报错
10,static 存在的主要意义
1,创建独立于具体对象域变量或方法,以至于既使没创建对象,也能使用属性和调用方法
2,用来形成静态代码块,以优化程序性能,static代码块可以在程序任意地方,可以有多个static代码块,并且只执行一次
3,