Mybatis
1. Mybatis执行流程
答:
- 首先加载Mybatis的配置文件,读取Mybatis的配置信息。
- 构造SqlSessionFactory会话工厂,通过
SqlSessionFactoryBuilder
根据配置信息生成SqlSessionFactory
实例。 - 会话工厂创建SqlSession
- SqlSession获取Mapper接口的代理对象,然后根据Mapper接口中的方法名找到对应的SQL,执行SQL语句。
- 根据resultMap将查询结果映射为Java对象。
- 使用完毕关闭SqlSession
2. 一级缓存、二级缓存
答:
- 一级缓存: 作用域是
SqlSession
级别(与数据库的一次会话),也就是在同一个SqlSession下可以走缓存。基于HashMap的本地索引, 默认是打开的,无法关闭。 - 二级缓存: 作用域
namespace
级别的,查询同一个mapper中的方法会走缓存,默认是关闭的。
二级缓存的缺点:
- 数据一致性问题: 二级缓存是可以被多个
SqlSession
共享的,所以就有可能出现并发安全问题。 - 资源消耗问题: 二级缓存会缓存一个
mapper
中记录,可能会消耗更多的内存资源。
3. Mybatis中${}和#{}有什么区别
答:
- ${}:Mybatis会直接将 ${} 中的内容拼接在SQL语句中,容易引发SQL注入问题。
- #{}:Mybatis会创建预处理(
PreparedStatement
)语句,将 SQL 中的 #{} 替换为?
号,然后会调用PreparedStatement
的set
方法来赋值。能够预防SQL注入问题。
预处理语句(PreparedStatement)的优势:
- 性能更好:相比于
statement
,预处理语句只会编译一次,然后多次使用。减少SQL语句的编译次数,提高数据库的执行效率。 - 防止SQL注入:
PreparedStatement
可以使用参数占位符?
,并且会对参数进行合适的转换。