1.一级缓存
注:一级缓存默认开启在sqlsession范围内,也就是拿到连接到关闭连接,俩次查询相同
一级失效情况:
1.俩次查询不相同
2.增删改操作,会刷新缓存
3.查询不同的mapper
4.清理缓存 sqlsession.clear();
2.?二级缓存
1.手动配置文件开启全局缓存(默认开启) cacheabled =true
注:作用域是namespace级别,一级缓存会话关闭会放到二级缓存继续使用
((1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
(2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;
(3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存,则只根据配置判断是否刷新。
)
3. Mybatis动态sql有什么用?执行原理?有哪些动态sql?
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断 并动态拼接sql的功能。
Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind
4.#{}和${}的区别是什么?
${}是字符串替换,#{}是预处理;,防止sql注入
Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
4.什么是mybatis
1.mybatis是一个半自动ORM框架,封装了对数据库连接等复杂操作,让我们只需关注SQL编写,灵活度高
2.可以使用xml或者注解方式来编写
5.mapper接口不可以重载
Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,然后将sql执行结果返回。
Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略
(原因就是namespace+id是作为Map的key使用的)
6.使用MyBatis的mapper接口调用时有哪些要求?
?Mapper接口方法名和mapper.xml中定义的每个sql的id相同;
7. 模糊查询like语句该怎么写?
第1种:在Java代码中添加sql通配符。
? ? string wildcardname = “%smi%”;
? ? list<name> names = mapper.selectlike(wildcardname);
? ? <select id=”selectlike”>
? ? select * from foo where bar like #{value}
? ? </select>
第2种:在sql语句中拼接通配符,会引起sql注入
? ? string wildcardname = “smi”;
? ? list<name> names = mapper.selectlike(wildcardname);
? ? <select id=”selectlike”>
? ? ? ? select * from foo where bar like "%"${value}"%"
————————————————
版权声明:本文为CSDN博主「张维鹏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a745233700/article/details/80977133
参考文章