MyBatis相关问题

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 就将清空,
默认打开一级缓存。如下所示:

 使用同一个sqlSession对象获取两次UserMapper对象,进行了两次用户数据的查

询。控制台的输出结果如下所示:

 只执行了一次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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值