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面试题的主要内容,如果未能解决你的问题,请参考以下文章

WEB前端面试题

Linux 面试题

2020年1-6月份Java面试题总结,20多类1100道面试题含答案解析

Android面试题Android高级/资深面试题

JAVA面试题合集 JAVA面试题

前端面试题