河南网站优化外包服务,千锋教育培训多少钱费用,做gif的网站,遵义公司网站制作哪家好Mybatis 面试
1、Mybatis 的执行流程是什么#xff1f;
1、读取MyBatis配置文件#xff1a;mybatis-config.xml 加载运行环境 和 映射文件
2、构造会话工厂 SqlSessionFactory #xff08;全局只有一个#xff09;
3、会话工厂创建SqlSession对象#xff08;项目与数据…Mybatis 面试
1、Mybatis 的执行流程是什么
1、读取MyBatis配置文件mybatis-config.xml 加载运行环境 和 映射文件
2、构造会话工厂 SqlSessionFactory 全局只有一个
3、会话工厂创建SqlSession对象项目与数据库的会话包含了执行SQL 语句的所有方法每次操作都会创建一个会话
4、操作数据库接口Executor 执行器同时负责查询缓存的维护
5、Executor 接口的执行方法中有一个 MappedStatement 类型的参数封装了映射信息
6、输入参数映射将 Java 的对象转化为数据库所支持的类型
7、输出映射结果再将执行后数据库的类型转化为 Java 类型
2、Mybatis 是否支持延迟加载
Mybatis 支持延迟加载但默认没用开启
局部的延迟加载Mybatis 支持 一对一关联对象 和 一对多关联集合对象的延迟加载加 fetchType“lazy”
全局的延迟加载可以 在Mybatis 配置文件中可以配置是否启用延迟加载 lazyLoadingEnabledtrue|false
什么是延迟加载
假设 有一个 User 实体类 其里面封装了关于订单的 List 属性当查询用户时将订单数据也查出来此时为立即加载若查询用户时暂时不查询订单数据当只有需要查询List的时候进行查询此时为延迟加载
延迟加载的原理
1、使用CGLIB 创建目标对象的代理对象
2、当调用目标方法 user.getOrderList() 时进入拦截器invoke 方法发现 user.getOrderList() 是 null 值执行 sql 查询 order表
3、将order查询出来进行封装返回
3、Mybatis 的一级、二级缓存
本地缓存基于PerpetualCache本质是一个HashMap
一级缓存:
基于 PerpetualCache 的 HashMap 本地缓存其存储作用域为 SessionsqlSession当Session进行flush或close之该Session中的所有Cache就将清空默认打开一级缓存。
当两次查询相同时同一个sqlSession只会执行一次 SQL 第一次查询后会将数据放入本地缓存中第二次查询时直接从缓存中得到数据。
二级缓存:
作用域是namespace和mapper的作用域不依赖于session默认采用 PerpetualCache 的 HashMap 存储默认时关闭二级缓存的。
开启二级缓存 在Mybatis 配置文件中 开启二级缓存 cacheEnabletrue|false并在映射文件中加 cache/标签 这时就开启了二级缓存。
当开启二级缓存时两次查询条件相同时但调用不同的sqlSession只会执行一次 SQL 。
注意事项: 1对于缓存数据更新机制当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后默认该作用域下所有 select 中的缓存将被 clear。
2二级缓存需要缓存的数据实现Serializable接口。
3只有会话提交或者关闭以后一级缓存中的数据才会转移到二级缓存中
4、Mybaits $ 和 # 的区别
#{ }可以防止Sql 注入它会将所有传入的参数作为一个字符串来处理。
Mybatis在处理#{}时会将SQL语句中的#{}替换为?号调用PrepaerdStatement的set方法来赋值。
$ {} 则将传入的参数拼接到Sql上去执行一般用于表名和字段名参数$ 所对应的参数应该由服务器端提供前端可以用参数进行选择避免 Sql 注入的风险 。
Mybatis在处理 时就是把 {}时就是把 时就是把{}换成变量的值。