1. 谈一谈你对 Mybatis 框架的理解

  1. mybatis是一个优秀的持久层框架 , 一个半ORM(对象关系映射)框架,它支持定制化SQL 存储过程以及高级映射
  2. mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
  3. mybatis可以使用简单的xml或注解来配置和映射原生类型 , 接口和Java的pojo为数据库中的记录

2. 在 mybatis 中,${} 和 #{} 的区别是什么?(必会)

  1. #{}是占位符 , 预编译处理 , ${}是字符串替换
  2. MyBatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值
  3. MyBatis在处理${}时, 就是把${}替换成变量的值
  4. 使用#{}可以有效的防止SQL注入, 提高系统安全性


3. MyBatis编程步骤是怎样的?

  1. 创建SqlSessionFactory
  2. 通过SqlSessionFactory 创建SqlSession
  3. 通过SqlSession执行数据库操作
  4. 调用session.commit( )提交事务
  5. 调用session.close( )关闭会话

4. 在MyBatis中resultMap和resultType区别是什么?

  1. 如果数据库结果集中的列名和要封装实体的属性名完全一致的话用resultType属性
  2. 如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用resultMap属性 , 通过resultMap手动建立对象关系映射,resultMap要配置一下表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来

5. 在MyBatis中你知道的动态SQL的标签有哪些?作用分别是什么?

  1. if是为了判断传入的值是否符合某种规则,比如是否不为空
  2. where 标签可以用来做动态拼接查询条件,当和 if 标签配合的时候,不用显示的声明类型where 1= 1 这种无用的条件
  3. foreach标签可以把传入的集合对象进行遍历 ,然后把每一项的内容作为参数传到sql语句中
  4. include可以把大量的重复代码整理起来,当使用的时候直接include即可 , 减少重复代码的编写
  5. 使用于更新中, 当匹配某个条件后,才会对该字段进行更新操作

6. 谈一下你对 mybatis 缓存机制的理解?(了解)

Mybatis 有两级缓存,

  • 一级缓存是 SqlSession 级别的,默认开启,无法关闭;
  • 二级缓 存是 Mapper 级别的,二级缓存默认是没有开启的,但是手动开启
  1. 一级缓存:基础 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session, 当 Session flush 或 close 之后,Session 中的所有 Cache 就将清空
    2. 二级缓存其存储作用域为 Mapper(Namespace),使用二级缓存属性类需要实现 Serializable 序列化接口
    3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces) 的进行了 C(增加)/U(更新)/D(删除)操作后,默认该作用域下所有 select 中的缓存将被 clear. 需要在 setting 全局参数中配置开启二级缓存,如下 conf.xml 配置
    image.png