点关注,不迷路;持续更新java架构相关技术及资讯热文!!!
mybatis是现在非常主流的持久层框架,虽然平时用的多,但是其中几个细节的问题,能说出个所以然来不?
1、要点:
#{}
是编译处理,可以防止 sql 注入攻击。${}
是静态文本替换,有 sql 注入攻击风险。2、详情:
#{}
会将sql语句编译好并使用占位符?,然后再进行取值(值转换成字符串)很大的程度防止sql注入。${}先取值(不做任何处理直接引用)然后再去编译sql语句,无法防止sql注入,一般用于传入数据库对象,比如表名之类的。#{}
是sql的参数占位符,mybatis会将sql中的#{}替换为 ?号,会编译处理。在sql执行前会使用preparedstatement的参数设置方法,按序给sql的 ?号占位符设置参数值。{driver}会被静态替换为com.mysql.jdbc.driver。缓存是一个持久层框架非常重要的一个功能,她可以减轻数据库访问的压力,提高应用的性能。mybatis 的缓存分为两级:一级缓存和二级缓存。
1、一级缓存
mybatis 的一级缓存是sqlsession级别的缓存,默认开启。她是基于 perpetualcache 的 hashmap 本地缓存,其存储作用域为 session。
在操作数据库的时候需要先创建sqlsession会话对象,在对象中有一个hashmap用于存储缓存数据,此hashmap是当前会话对象私有的,别的sqlsession会话对象无法访问。当 session flush 或 close 之后,该session中的所有缓存就会被清空。
缓存过程:
2、二级缓存
mybatis 的二级缓存是 mapper 级别的缓存,默认不开启,需手工配置。其存储作用域为 mapper,也就是同一个 namespace 的 mappe.xml。
二级与一级缓存其机制相同,默认也是采用 perpetualcache,hashmap存储,不同在于其存储作用域为 mapper(namespace),并且可自定义存储源,如 ehcache、hazelcast等。当多个sqlsession使用同一个mapper操作数据库的时候,得到的数据会缓存在同一个二级缓存区域。
缓存流程:
3、缓存注意事项
好了,时间关系,今天先记录着两个常见问题吧。上面的两个 mybatis 的问题你都清楚了吗。
如对本文有疑问, 点击进行留言回复!!
【奥鹏作业答案库网】大工20春《应用统计》在线作业1【奥鹏作业答案】
网友评论