面试那些事儿——Mybatis & Mybatis-Plus

目录

  • mybatis介绍
    • 缓存
    • 延迟加载
    • mybatis是怎么和数据库交互的
    • 重载
    • 常见面试题
  • mybatis-plus
    • nacos配置
    • 使用
    • 常用实体类注解
  • 更多

mybatis介绍

Java编写的持久层框架

  • 实质:就是对jdbc的优化
  • 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
  • 可以用简单的xml或注解来配置和映射原生类型,

缓存

一级缓存(默认开启)

  • 针对每个sqlsession而言

二级缓存

  • namespace

延迟加载

是否支持延迟加载 :

  • 支持association关联对象(一对一)和collection关联集合对象(一对多)
  • mybatis配置文件中,可以配置是否启用延迟加载
  • lazyLoadingEnabled=true|false

原理:

  • 使用 CGLIB 创建目标对象的代理对象,
  • 当调用目标方法时,进入拦截器方法,
  • 比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。
  • 不光是mybatis,Hibernate延迟加载原理也一样

mybatis是怎么和数据库交互的

  • 通过dao层进入到mapper,它们之间是用id去关联的。resulttype是它所在的pojo路径。常用的还有resultMap。如果是使用的mybatisPlus,我们可以直接调save等方法,不用手写sql,会用plus封装好的方法直接查询数据。

  • 当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,而resultType中的内容就是pojo在本项目中的位置。

  • resultMap(适合多表–在mapper中进行返回字段处理)

  • 当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。

  • 常用的sql标签还有test,if,choose,when等

Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个MappedStatement,

//举例:

com.mybatis.mappers.StuDao.findStuById
//可以唯一找到 namespace 为com.mybatis.mappers.StuDao下面id = findStuById的MappedStatement。

//在 MyBatis 中,每一个