Mybais面试题
Posted zyzyblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybais面试题相关的知识,希望对你有一定的参考价值。
1、对于Hibernate和MyBatis的区别与利弊,谈谈你的看法
Hibernate与MyBatis的对比:
1.MyBatis非常简单易学,与Hibernate相对较复杂,门槛较高;
2.二者都是比较优秀的开源产品;
3.当系统属于二次开发,无法对数据库结构做到控制和修改,那MyBatis的灵活性将比Hibernate更适合;
4.系统数据处理量大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标.在这种情况下MyBatis会有更好的可控性和表现;
5.MyBatis需要手写sql语句,也可以生成一部分,Hibernate则基本上可以自动生成,偶尔会写一些hql.同样的需求,MyBatis的工作量比Hibernate要大很多.类似的,如果涉及到数据库字段的修改,Hibernate修改的地方很少,而MyBatis要把那些sql mapping的地方–修改;
6.MyBatis以数据库字段–对应映射得到的po和Hibernate这种对象化映射得到的po是截然不同的,本质区别在于这种po事扁平化的,不像Hibernate映射的po是可以表达立体的对象继承,聚合等等关系的,这将会直接影响到你的整个软件系统的设计思路;
7.Hibernate现在已经是主流OR Mapping框架,从文档的丰富性,产品的完善性,版本的开发速度要强于MyBatis.
2、#{}和${}的区别是什么?
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
3、什么是延时加载,SQLMap中如何给一个ResultMap定义延时加载?
延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。
Mybatis的延迟加载功能默认是关闭的
需要在SqlMapConfig.xml文件中通过setting标签配置来开启延迟加载功能
在resultMap中使用association或者collection,即可使用延迟加载。
延迟加载需要两个statement语句来完成
在resultMap中使用association或者collection来配置两个statement直接的管理
4、简述MySQl索引原理以及创建索引的原则
创建索引:
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
1.ALTER TABLE
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,mysql将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
2.CREATE INDEX
CREATE INDEX可对表增加普通索引或UNIQUE索引。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
索引建立原则
(1)尽量减少like,但不是绝对不可用,”xxxx%” 是可以用到索引的
(2)表的主键、外键必须有索引
(3)谁的区分度更高(同值的最少),谁建索引,区分度的公式是count(distinct(字段))/count(*)
(4)单表数据太少,不适合建索引
(5)where,order by ,group by 等过滤时,后面的字段最好加上索引
(6)如果既有单字段索引,又有这几个字段上的联合索引,一般可以删除联合索引;
(7)联合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
(8)联合索引: mysql 从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index(a,b,c). 可以支持 a|a,b|a,b,c 3种组合进行查找,但不支持 b,c 进行查找.当最左侧字段是常量引用时,索引就十分有效。
(9)前缀索引: 有时候需要索引很长的字符列,这会让索引变得大且慢。通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。其缺点是不能用于ORDER BY和GROUP BY操作,也不能用于覆盖索引 Covering index(即当索引本身包含查询所需全部数据时,不再访问数据文件本身)。
(10)NULL会导致索引形同虚设
在mysql中使用索引的原则有以下几点:
1、 对于查询频率高的字段创建索引;
2、 对排序、分组、联合查询频率高的字段创建索引;
3、 索引的数目不宜太多
原因:a、每创建一个索引都会占用相应的物理控件;
b、过多的索引会导致insert、update、delete语句的执行效率降低;
4、若在实际中,需要将多个列设置索引时,可以采用多列索引
如:某个表(假设表名为Student),存在多个字段(StudentNo, StudentName, Sex, Address, Phone, BirthDate),其中需要对StudentNo,StudentName字段进行查询,对Sex字段进行分组,对BirthDate字段进行排序,此时可以创建多列索引
index index_name (StudentNo, StudentName, Sex, BirthDate); #index_name为索引名
在上面的语句中只创建了一个索引,但是对4个字段都赋予了索引的功能。
创建多列索引,需要遵循BTree类型,
即第一列使用时,才启用索引。
在上面的创建语句中,只有mysql语句在使用到StudentNo字段时,索引才会被启用。
如: select * from Student where StudentNo = 1000; #使用到了StudentNo字段,索引被启用。
可以使用explain检测索引是否被启用
如:explain select * from Student where StudentNo = 1000;
5、选择唯一性索引
唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。
6、尽量使用数据量少的索引
如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。
7、尽量使用前缀来索引
如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
8、删除不再使用或者很少使用的索引.
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响
以上是关于Mybais面试题的主要内容,如果未能解决你的问题,请参考以下文章