当前位置: 首页>后端>正文

mybatis

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

参考文章


https://www.xamrdz.com/backend/3pa1929054.html

相关文章: