Mybatis基础
1.提交任务时,线程池队列已满时会发生什么?
如果一个任务不能被调度执行那么ThreadPoolExecutor的submit()方法将抛出一(拒绝执行)RejectedExecutionException异常。(当线程池的排队策略为有界队列,而提交的任务超过了有界队列的长度时,就会抛出该异常,所以排队策略可以不用有界队列,但需要注意任务太多无界队列造成内存溢出)
2.常见的数据库优化手段
库表优化,表设计合理化,符合三大范式;添加适当的索引(普通索引、主键索引、唯一索引、全文索引);分库分表;读写分离等;sql语句优化(先定位执行效率低,慢sql的语句,分析原因)
三大范式:表中列的属性具有原子性,不可以再分割;表中的记录唯一性,一般通过创建主键;表中除去冗余的数据,表中的数据能够单独推算出来。
3.索引的优缺点,什么字段上建立索引
优点:通过创建索引可以保证数据的唯一性;大大加快数据的检索速度。是主要目的;在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
缺点:创建索引和维护索引要耗费时间,并随着数据的增加而增加;每一个索引都需要占据额外的物理空间,需要的磁盘开销大;当对表中数据进行增加、删除、修改操作时,索引也需要动态维护,降低了数据的维护速度。
一般来说,在经常需要搜索的列上,经常使用where字句的列上可以添加索引,以提升查询速度;对于一些甚少使用或者参考的列,不建议使用索引。
4.数据库连接池
数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中连接进行申请、使用、释放;
(1):程序初始化时创建连接池
(2):使用时向连接池申请可用连接
(3):使用完毕。将连接返回给连接池
(4):程序退出时,断开所有连接,并释放资源
5.spring使用了那些设计模式
1.工厂模式:在各种BeanFactory以及ApplicationContext创建中都用到了
2.模板模式:在各种BeanFactory以及ApplicationContext创建中都用到了
3.代理模式:在AOP实现中用到了JDK的动态代理
4.单例模式:创建bean的时候
6.redis是单线程的。
7.redis的持久化策略
rdb和aof都是redis提供的一种持久化策略。
rdb:快照形式是直接把内存中的数据保存到一个dump的文件中,定时保存
aof:把所有对redis的服务器进行修改的命令都存到一个文件里,命令的集合
8.什么是mybatis?
1.mybatis是一个半ORM(对象关系映射)框架,内部封装了JDBC。
2.mybatis可以使用XML或注解来配置和映射原生关系。
3.通过XML文件或注解的方式将要执行的各种statement配置起来,并通过Java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为Java对象并返回。
9.mybatis的优点:
1.基于SQL语句编程,SQL语句写在XML中,解除了sql与程序代码的耦合,可重复使用
2.数据库兼容性好,JDBC支持的数据库mybatis都支持
3.能够与spring很好的集成
10.mybatis的缺点:
1.SQL语句的编写工作量大,
2.SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
11.mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以使用分页插件来实现物理分页。
分页插件的基本原理是使用mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,重写sql
12.Mybatis是如何将sql执行结果封装为目标对象并返回的,都有哪些映射形式?
使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的关系
使用sql列的别名功能,将列的别名书写为对象属性名
Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
13.#{}和${}的区别是什么?
#{}是预编译处理,${}是字符串的替换
Mybatis在处理#{}时,会将sql中的#{}替换为?,调用PreparedStatement的set方法来赋值
Mybatis在处理${}时,就是把${}替换成变量的值;使用#{}可以防止sql注入
14.Mybatis中的动态sql有什么用?执行原理?
动态sql方便我们在sql语句中实现某些逻辑,
执行原理就是根据表达式的值完成逻辑判断并动态拼接sql的功能。
15.为什么说Mybatis时半自动ORM映射工具?
Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以称为半自动ORM映射工具。
16.Mybatis是否支持延迟加载?如果支持,他的实现原理是什么?
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询,在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false
原理就是,使用cglib创建目标对象,通过代理拦截指定方法,执行数据加载。
17.什么是Mybatis的接口绑定?有那些实现方式?
接口绑定就是在Mybatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,通过调用接口来实现SQL语句操作。
注解绑定(在接口上边加@Select等注解)和通过XML绑定
18.使用Mybatis的mapper接口调用时有哪些要求?
1.Mapper接口方法名和mapper.xml中定义的每个sql的id相同
2.Mapper接口方法的输入参数类型和mapper.xml中定义的parameterType的类型相同
3.Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType类型相同
4.Mapper.xml文件中的namespace即是mapper接口的类路径。