MyBatis面试题整理

  1. 什么是MyBatis?

    MyBatis是一个实现了JPA规范的用来连接数据库并对其进行增删改查操作的开源框架 
    (就和传统的JDBC一样,就是个连接数据库的东西),其实,它底层就是一个JDBC封装的组件。
    复制代码
  2. #{}和${}的区别是什么? 应用场景

    #{}是预编译处理,${}是字符串替换。 Mybatis在处理#{}时,会将sql中的#{}替换为?号,
    调用PreparedStatement的set方法来赋值; Mybatis在处理${}时,就是把${}替换成变量的值。
    使用#{}可以有效的防止SQL注入,提高系统安全性。
    复制代码
  3. 在mapper中如何传递多个参数,都有哪几种

    方法1:顺序传参法
        #{}里面的数字代表你传入参数的顺序
    方法2:@Param注解传参法 
        #{}里面的名称对应的是注解 @Param括号里面修饰的名称
    方法3:Map传参法
        #{}里面的名称对应的是 Map里面的key名称。
    方法4:Java Bean传参法
        #{}里面的名称对应的是 User类里面的成员属性。
    复制代码
  4. 说出MyBatis动态标签(至少5个)

    1,用来循环容器的标签foreach
    2,concat模糊查詢
    3,choose(when,otherwise)标签
    4,selectKey标签
    5,if标签
    复制代码
  5. parameterType和resultType的区别

    1、使用 resultType :主要针对于从数据库中提取相应的数据出来
    2、使用parameterType :主要针对于将信息存入到数据库中 
    如:  insert 增加数据到数据库zhong   Update等
    复制代码
  6. 在用MyBatis插入时,如何得到数据库自增的主键值?

    1.在insert标签中使用 useGeneratedKeys、keyProperty、keyColumn 属性获取;
    2.在insert标签中嵌套 selectKey 标签获取。
    复制代码
  7. MyBatis批量删除/添加时,代码实现

    删除
    delete from emp where empno in #{arr}
    插入
    INSERT INTO 表名 ( 列名1, 列名2, 列名3) VALUES ( #{内容1}, #{内容1}, #{内容1})
    复制代码
  8. MyBatis动态SQL执行流程和原理

    1、获取sqlSessionFactory对象:
    根据配置文件(全局,sql映射)初始化出Configuration对象
    解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSession;
    注意:MappedStatement:代表一个增删改查的详细信息
    2、获取sqlSession对象
    返回一个DefaultSQlSession对象,包含Executor和Configuration;
    这一步会创建Executor对象;
    Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
    3、获取接口的代理对象(MapperProxy)
    DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy;
    使用MapperProxyFactory创建一个MapperProxy的代理对象
    代理对象里面包含了,DefaultSqlSession(Executor)
    4、执行增删改查方法
    ​
    1)调用DefaultSqlSession的增删改查(Executor);
    2)会创建一个StatementHandler对象。
    (同时也会创建出ParameterHandler和ResultSetHandler)
    3)调用StatementHandler预编译参数以及设置参数值;
    使用ParameterHandler来给sql设置参数
    4)调用StatementHandler的增删改查方法;
    5)ResultSetHandler封装结果
    复制代码

JDBC和Mybatis性能效率哪个块?为什么

jdbc快
1. jdbc直接是在java中写sql语句,不需要配置xml文件
2. mybatis是在jdbc上进一步封装得,需要去映射和加载配置文件,所以jdbc比mybatis效率快
复制代码

MyBatis框架中用到了哪些设计模式?

1. 工厂模式:例如sqlSessionFactory
2. 代理模式:mybatis实现的核心,比如
MapperProxy用的jdk的动态代理
3. 模板方法模式: 例如BaseExecutor和SimpleExecutor
复制代码
  1. MyBatis 一级缓存和二级缓存的区别

    一级缓存:

    Mybatis 默认只是开启一级缓存,一级缓存只是相对于同一个 SqlSession 而言。
    只有在参数和SQL完全一样的情况下,并且使用同一个 SqlSession 的情况下,Mybatis 才会将第一次的查询结果缓存起来,后续同一个SqlSession的再查询,就会命中缓存,而不是去直接查库

    二级缓存:

    一级缓存对于使用不同的 SqlSession 并不会命中缓存,即一级缓存必须 SqlSession,参数与Sql必须完全一致

    二级缓存需要手动配置,使得缓存在SqlSessionFactory层面上能够提供给各个Sql Session 共享

    二级缓存能够对同样参数,同样Sql语句,当时不同 SqlSession的查询提供命中