MyBatis+MyBatisPlus 面试题


Mybatis

MyBatis 是一个​持久层框架,专注于 SQL 映射和数据库操作,通过简单的 XML 或注解配置即可实现高效的数据访问

Mybatis中#{}与${}区别

​**#{}:#{}是预编译处理,会把参数变成SQL里的占位符?,能防SQL注入,安全又高效
${}**: ${} 是直接字符串拼接,参数值会原样插到 SQL 里

mybatis中一对多,多对一怎么映射

多对一用association标签
一对多用collection

mybatis主键回填

在标签中使用keyproperty属性,值为id

Mybatis缓存策略

一级缓存
同一个 SqlSession 中有效。默认开启
​生命周期:
当执行 insert、update、delete 操作时,一级缓存会被清空。
SqlSession 关闭时,缓存自动清除。
​适用场景:
同一会话内多次查询相同数据

二级缓存(Second Level Cache)​
Mapper 级别,跨 SqlSession 共享。
​生命周期:
需手动启用,配置在 Mapper XML 或注解中。
默认使用 LRU(最近最少使用)淘汰策略。
支持多种缓存实现(如 Ehcache、Redis)。
​适用场景:
跨会话的频繁查询(如热点数据)。
数据变动不频繁的静态数据(如字典表)

Mybatis执行流程

  1. 加载配置文件
    解析 mybatis-config.xml,初始化数据源、事务管理器、类型别名等。
  2. 创建 SqlSessionFactory
    通过 SqlSessionFactoryBuilder 构建工厂对象,用于生成 SqlSession。
  3. 开启 SqlSession
    通过 SqlSessionFactory.openSession() 获取会话,开启事务。
  4. ​执行 SQL 操作
    调用 Mapper 接口方法或直接执行 SQL 语句。
  5. ​处理动态 SQL
    解析 XML 中的动态标签(如 ),生成最终 SQL。
  6. ​参数绑定与执行
    将参数绑定到预处理语句,执行 SQL 并获取结果集。
  7. ​结果映射
    将结果集转换为 Java 对象,支持自动或手动映射。
  8. ​事务提交与资源释放
    提交事务或回滚,关闭 SqlSession。

Mybatis中resultMap和resultType区别

resultType:
适用于列名与属性名一致的场景,优先选择 resultType,简化配置。
resultMap:
​复杂场景使用 列名不一致、需要关联查询或嵌套映射时,使用 resultMap。

​能用 resultType 就不用 resultMap,除非必须自定义映射逻辑

MyBatis 怎么处理结果集映射的?字段名不一样咋办?

简单的就直接用 resultType,字段名和数据库列名一致的话,直接映射到实体类就行。
要是字段名不一样,比如数据库里是 create_time,实体类是 createTime,就用 resultMap 做映射,在 XML 里配一下列名和属性名的对应关系就行。

MyBatis 怎么做分页?

普通场景用 PageHelper,大数据量分页 + 选字段 + 游标查询。

Mapper 无实现类为啥能执行?

MyBatis 动态代理,自动生成代理类,解析 SQL 执行。

MyBatis 性能问题怎么解?

加索引、分页查、抽离公共 SQL,避免全表扫描和大结果集。

MyBatis 和 Spring 怎么整合?

Spring 托管 SqlSessionFactory,扫描 Mapper 生成代理对象,直接注入使用。

MyBatis 怎么处理关联查询?

一对一用 association,一对多用 collection,在 resultMap 里嵌套配置。

MyBatis 插件用过啥?原理是啥?

用过 PageHelper,原理是拦截 Executor/StatementHandler 核心组件的方法。

MybatisPlus


文章作者: zrh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zrh !
  目录