zoukankan      html  css  js  c++  java
  • 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、删除不再使用或者很少使用的索引.

         表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响

  • 相关阅读:
    js对象的sessionStorage,判断对象相等,判断是否包含某属性
    vant-ui的van-area使用
    JavaScript返回格式化的时间字符串
    vant-ui的van-uploader上传图片
    移动端vue页面禁止移动/滚动
    vue项目中的跨域源请求拦截问题CORS头缺少'Access-Control-Allow-Origin'
    项目开发过程中踩坑和填坑
    周报
    构建一个最简单的react程序
    Socket实现简易“多人聊天室”
  • 原文地址:https://www.cnblogs.com/zyzyBlog/p/12374512.html
Copyright © 2011-2022 走看看