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

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 中,每一个<select>、<insert>、<update>、<delete>标签,
//都会被解析为一个MappedStatement对象。而它们的关联是通过id来唯一确定的

重载

Dao 接口里的方法可以重载,但是Mybatis的XML里面的ID不允许重复。

public interface StuMapper {
   

    List<Student> getStu();
    
    List<Student> getStu(@Param
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值