Mybatis常见面试题

什么是 MyBatis?

MyBatis 是一个半自动化的 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

MyBatis 的执行原理

  1. 解析配置文件和映射文件,生成内部数据结构。
  2. 创建 SQLSession 实例,负责与数据库进行交互。
  3. 执行 SQL 语句并返回结果集。
  4. 将结果集映射到 Java 对象,并返回给调用者。

MyBatis 的优点

  • 内置JDBC,简化了数据库操作的编写过程,提高了开发效率。
  • 基于SQL编程,很灵活,SQL写在xml文件里,与程序解耦,便于管理
  • 提供映射标签,对象和数据库字段的相互映射

MyBatis 的缺点

  • SQL的编写量很大的时候,对开发人员的SQL功底有要求
  • SQL依赖数据库,导致数据库移植性差

MyBatis和Hibernate的区别

  1. mybatis是半自动化对象关系映射框架,查询关联对象或关联集合对象时,需要手动编写sql来完成
    Hibernate是全自动化对象关系映射框架,查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取
  2. MyBatis控制sql执行,灵活度高
    Hibernate虽然灵活度没那么高,但是可以节省代码,效率高
  3. mybatis数据库无关性差,移植性差
    Hibernate数据库无关性好,移植性好,靠的是强大的hql语言。
  4. mybatis日志只是基础记录功能
    Hibernate日志更加完善

MyBatis 的缓存机制是什么?

  • 一级缓存默认开启,在同一个sqlSession会话下的操作都会存入缓存,请求查询的数据都会存入缓存。当会话,有增删改操作,并提交的时候,缓存清空,没有失效时间,会随会话结束而结束
    二级缓存:会话是全局的,一个sqlSessionFactory里面可能有多个sqlSession,sqlSession之间共享数据。当一级缓存关闭或者清除的时候会存进二级缓存。当会话中,有增删改的操作,并且commit时,缓存就会清空。cache失效时间默认是一小时实体类还需要实现序列化

MyBatis 实现分页

  • 使用 RowBounds 对象来限制查询结果的起始行数和最大行数。
  • SQL 语句中使用 LIMIT 或 offset limit 来实现分页。

#{} 和 ${} 区别是什么?

${}是 Properties 文件中的变量占位符,用于静态文本替换,比如 ${driver} 会被静态替换为 com.mysql.jdbc.Driver ,有sql注入风险
#{}是 SQL 的参数占位符,MyBatis 会将 SQL 中的 #{} 替换为对应的 Java 对象属性值,并且自动处理 SQL 注入的风险。

mybatis获取自动生成主键的值

使用**usegeneratedkeys=”true”**,在新增成功之后,会返回id,到你的对象中

1
2
3
<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>
sql
</insert>