承接上文:Mybatis基础知识-CSDN博客
8 如何使用Mybatis实现批量插入 ?
批量插入数据:
1
、
mybatis
的接口方法参数需要定义为集合类型
List
public abstract void saveUsers(List<User> users);
2
、在映射文件中通过
forEach
标签遍历集合,获取每一个元素作为
insert
语句的参数值
<!-- 批量插入用户 -->
<insert id="savaUsers" parameterType="java.util.List">
insert into tb_user(user_name,password)
values
<foreach collection="list",item="user",index="index",separator=",">
(#{user.userName},#{user.password})
</foreach>
</insert>
9 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};
</select>
</mapper>
运行程序进行测试,控制台输出结果如下所示:
只进行了一次查询,那么就说明数据已经进入到了二级缓存中。
3
、对于缓存数据更新机制,当某一个作用域
(
一级缓存
Session/
二级缓存
Namespaces)
的进行了新增、修改、删除操作后,默认该作用域下所有
select
中
的缓存将被
clear
。
注意事项:
1
、二级缓存需要缓存的数据实现
Serializable
接口
2
、只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中
3
、可自定义存储源,如
Ehcache
。