
文章目录
- Mybatis常见面试题总结
- 1.Mybatis的整体流程能简单讲下吗?
- 2.为什么调用dao接口的方法就能调用sql查询数据,实现原理是什么?
- 3.mybatis的一级缓存和二级缓存你了解吗?能说下他们的区别吗?
- 追问:什么时候有清除?
- 4.Mybatis中的执行器你了解吗?他们的区是什么?
- 5.Mybatis中的xml映射文件中的sql的id是否可以重复
- 6.Mybatis是如何进行分页的?分页插件的原理是什么?
- 7.#{}和${}的区别
1.Mybatis的整体流程能简单讲下吗?
初始化工作
1.解析配置文件,得到sqlSessionFactory,把配置文件中的参数都保存到configuration类中
2.解析mapper.xml文件,把每一个语句封装成一个MappedStatement,并且放入到Map;
key:namespace+sqlid value:MappedStatement
3.为每一个mapper接口类都会封装一个MapperProxyFactory与namespace映射关系保存到map中
会话创建
创建会话去执行sql,肯定离不开SqlSession,我们先介绍下什么是SqlSession,就像在Navicat中打开的
一个窗口,多个窗口就是多个sqlSession
- 创建事务
- 创建执行器,分别有三种执行器
- 返回DefaultSqlSession对象
语句执行 - 从knownMappers获取该接口的代理工厂类
- 使用JDK动态代理创建接口的代理类,MapperProxy 为代理类,用于代理Mapper接口方法,调用
mapper接口的方法都会到代理类MapperProxy的invoke方法 - 获取MappedStatement,这个在初始化的时候,我们就知道存的是什么,一个sql语句标签对应一
个MappedStatement - 通过执行器执行语句,返回结果
在第一步build的时候就会根据mapper XML里面的nameSpace拿到接口并且创建一个代理类工厂new
MapperProxyFactory<>(type),存入我们的knownMappers集合,此时还没有创建代理类:入口在parse的
if (StringUtils.hasText(this.sqlSessionFactoryBeanName)) {
definition.getPropertyValues().add(“sqlSessionFactory”,
new RuntimeBeanReference(this.sqlSessionFactoryBeanName));
explicitFactoryUsed = true;
} else if (this.sqlSessionFactory != null) {
definition.getPropertyValues().add(“sqlSessionFactory”,
this.sqlSessionFactory);
explicitFactoryUsed = true;
}
// …
definition.setLazyInit(lazyInitialization);
}
}bindMapperForNamespace(); 同时会把sql语句放入mappedStatements的一个map中
在调用session.getMapper(BlogMapper.class)方法时,会根据class创建一个代理类,并且返回代理类
执行方法时,执行的时我们代理类的方法MapperProxy,在代理类方法中,执行我们的逻辑,并且从
MappedStatement拿到一开始就加载好的sql语句
一级缓存:作用域为SqlSession,存在BaseExecutor下的PerpetualCache下的cache,默认开启。存入在查
询的方法里面
二级缓存:作用域为nameSpace
二级缓存开启需要2个条件:
1.要有CachingExecutor,所以由cacheEnabled配置决定,默认是true
2.Mapper必须要有Cache标签,也就是决定currentCache有没有
3.还要sql上useCache标签为true,对于query语句默认为true,如果想关闭,可以设置为false
增删改查的标签上有属性:
修改和删除都会清除缓存
simple: 普通执行器,默认, 对每条sql进行预编译->设置参数->执行等 *** 作
reuse:执行器会重用预处理语句(PreparedStatement)
batch:执行器不仅重用语句还会执行批量更新 批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行 *** 作
如果同一个nameSpace不可以,会报错,如果不是同一个nameSpace可以
6.Mybatis是如何进行分页的?分页插件的原理是什么?Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页,分页
插件的基本原理是使用 Mybatis 提供的插件口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql。
#{}是预编译处理,${}是字符串替换。 Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用PreparedStatement 的 set 方法来赋值; Mybatis 在处理时 , 就 是 把 {}替换成变量的值。 使用#{}可以有效的防止 SQL注入,提高系统安全性。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)