1、Mybatis #{}和${}的区别
1
、
#{}
是预编译处理,
${}
是字符串替换。
2
、
Mybatis
在处理
#{}
时,会将
sql
中的
#{}
替换为
?
号,调用
PreparedStatement
的
set
方法来赋值;
3
、
Mybatis
在处理
${}
时,就是把
${}
替换成变量的值。
4
、使用
#{}
可以有效的防止
SQL
注入,提高系统安全性。
2、Mybatis 如何获取生成的主键
使用
insert
标签中的
useGeneratedKeys
和
keyProperty
属性。使用方式如下所示:
<insert id = "saveUser" useGeneratedKeys = "true" keyProperty="id">
insert into tb_user(user_name,password,gender,addr) values (#
{username},#{password},#{gender},#{addr})
</insert>
属性说明:
1
、
useGeneratedKeys
:是够获取自动增长的主键值。
true
表示获取。
2
、
keyProperty
:指定将获取到的主键值封装到哪儿个属性里
3、Mybatis的一级、二级缓存 ?
1
、一级缓存
:
基于
PerpetualCache
的
HashMap
本地缓存,其存储作用域为
Session
,当
Session
进行
flush
或
close
之后,该
Session
中的所有
Cache
就将清空,
默认打开一级缓存。如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/2bf37a5b6bd5fce9e0552585360362a9.png)
使用同一个sqlSession对象获取两次UserMapper对象,进行了两次用户数据的查
询。控制台的输出结果如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/21183277fc6424dfaed7428331bb6505.png)
只执行了一次sql语句,说明第二次查询的时候使用的是缓存数据。
2
、二级缓存:二级缓存是基于
namespace
和
mapper
的作用域起作用的,不是依
赖于
SQL session
,默认也是采用
PerpetualCache
,
HashMap
存储。
如下代码:
当执行完sqlSession1.close()方法时一级缓存就一斤被清空掉了。再次获取了一个
新的
sqlSession
对象,那么此时就需要再次查询数据,因此控制台的输
出如下所示:
可以看到进行了两次查询。
默认情况下二级缓存并没有开启,要想使用二级缓存,那么就需要开启二级缓
存,如下所示:
①
全局配置文件
<settings>
<setting name="cacheEnabled" value="true"/> <!-- 开启二级缓存 -->
</settings>
②
映射文件
使用
<cache/>
标签让当前
mapper
生效二级缓存
<mapper namespace="com.itheima.mapper.UserMapper">
<cache/> <!-- 二级缓存生效 -->
<select id="selectAll" resultType="user">
select *
from tb_user;
</select>
<select id="selectById" resultType="user">
select *
from tb_user where id = #{id};
运行程序进行测试,控制台输出结果如下所示:
只进行了一次查询,那么就说明数据已经进入到了二级缓存中。
3
、对于缓存数据更新机制,当某一个作用域
(
一级缓存
Session/
二级缓存
Namespaces)
的进行了新增、修改、删除操作后,默认该作用域下所有
select
中
的缓存将被
clear
。
注意事项:
1
、二级缓存需要缓存的数据实现
Serializable
接口
2
、只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中
3
、可自定义存储源,如
Ehcache
。